2016-04-08 7 views
4

すばやく簡単な質問:std::bitsetはメモリに連続していることが保証されていますか?ビットセットは連続性を保証されていますか?

私はそれがCopyConstructibleとCopyAssignableコンセプトに従っていることは知っていますが、std::vectorのようなContiguousContainer(またはそのようなもの)ですか?

別にパディングから、私はこのような構造にビット演算をしたいのですが:

struct tmp 
{ 
    std::bitset<32> b; 
    unsigned int c; 
}; 

のでbの連続性は非常に重要です。もちろん、これはstd::bitsetが標準のレイアウトクラスであるかどうかを知ることにつながり、すべてのビット演算が機能するようになります。

+0

あなたは 'union { std :: bitset <32> bを意味しますか? 符号なしint c; }; '? – cpplearner

+0

いいえ、そうではありません。なぜあなたはすでに答えを知っているのですか?ヒント - 標準で指定されているものだけが保証されています。 – SergeyA

+0

いいえ、 'struct'です。私はメモリに2つのフィールド、 'bitset'と整数が必要です。 – senseiwa

答えて

1

このような保証はありません。 std::bitsetは私の経験上、面倒なインターフェースを持っているので、未定義の方法でもそれを使用する点はあまりありません。

レイアウトやストレージの保証が必要なクラスのような独自のビットセットを作成するだけです。

私は個人的に楽しんでいます。そして、私はbitsetインターフェイス(特に建設/シリアライゼーション/デシリアライゼーション)が特に良いとは思っていないので、私は罪悪感を感じていません。 (SSE intrinsticsを使用してアセンブリ命令を書いているなら、あなたのコンパイラの実装をどうにか合わせる/超えることができるかもしれません)

8

標準では、std::bitset<>に特定のレイアウトやビットオーダーを適用する必要はありません。

テンプレート引数として必要なビット数が指定されているということは、メモリが1つの連続したブロック(配列メンバー)として割り当てられていることを意味します。複数のブロックを割り当てることは、より複雑で、効率が低く、有用な目的を果たさないためです。

しかし、私はstd::bitset<>の内部表現へのアクセスを推奨したり、推奨したりしていません。

+0

メモリは1つのブロックに割り当てられていても、最初のビットへのポインタを得る良い方法はありません。 OPはそのようなオブジェクトにビット単位の操作を直接適用しようとしているので、オブジェクトにはそのビットのみが含まれていると暗黙的に想定されます(またはオブジェクトが破損しても気にしません)。 – Aleph

+0

@Aleph真であり、私は 'std :: bitset'の内部表現へのアクセスを推奨したり、推奨していません。 –

+1

OPがそれをやろうとしていないことを確認するだけです:)。 – Aleph

関連する問題