16

ビットセットが実際にどのようにメモリを割り当てるか知りたいです。いくつかのブログから、メモリを少しずつ消費することがわかりました。ただし、次のコードを実行すると:

   bitset<3> bits = 001;
   cout<<sizeof(bits);

出力は4になります。その背後にある説明は何ですか?

また、C ++でビット単位のスペースを割り当てる方法はありますか?

4

5 に答える 5

13

次のように概算できますsizeof(bitset<N>)

  1. 内部表現が32ビットの場合(32ビットシステムの符号なしなど)、4 * ((N + 31) / 32)
  2. 内部表現が64ビットの場合(64ビットシステムのunsigned longなど)8 * ((N + 63) / 64)

最初は本当のようです:4 * ((3 + 31) / 32)です4

于 2012-09-17T13:14:02.310 に答える
8

出力は 4 です。その背後にある説明は何ですか?

bitsetどのように実現すべきかについての情報は規格にありません。これは実装定義bitset headerです。コンパイラを見てください。

また、C++ でビット単位でスペースを割り当てる方法はありますか?

いいえ、C++ でビット単位でスペースを割り当てる方法はありません。

于 2012-09-17T12:53:43.800 に答える
8

CPU は個々のビットではなく、バイトとワードで動作します。あなたの場合、コンパイラはこのデータ構造を 4 バイトに揃えることを決定したため、sizeof(bits) の結果は 4 になります。

于 2012-09-17T12:53:54.800 に答える
1

通常、32 ビット プロセッサでは、コンパイラは割り当てられたメモリ サイズを 4 バイトの倍数にするため、3/8 より大きい最も近い 4 の倍数は 4 バイトです。

于 2012-09-17T12:54:56.357 に答える
0

個別のビットをアドレス指定することはできません。アドレス指定可能な最小単位はバイトです。いいえ、ビットを正確に割り当てることはできません。

もう 1 つはパディングです。ほとんどの場合、要求したよりも多くのバイトが割り当てられます。これは最適化のためです。32b 境界にないバイトのアドレス指定は多くの場合、コストがかかります。x64 CPU で 64b 境界にないバイトのアドレス指定を行うと、例外が発生します。(Intelプラットフォームといえば。)

于 2012-09-17T12:53:19.003 に答える