ビットセットが実際にどのようにメモリを割り当てるか知りたいです。いくつかのブログから、メモリを少しずつ消費することがわかりました。ただし、次のコードを実行すると:
bitset<3> bits = 001;
cout<<sizeof(bits);
出力は4になります。その背後にある説明は何ですか?
また、C ++でビット単位のスペースを割り当てる方法はありますか?
ビットセットが実際にどのようにメモリを割り当てるか知りたいです。いくつかのブログから、メモリを少しずつ消費することがわかりました。ただし、次のコードを実行すると:
bitset<3> bits = 001;
cout<<sizeof(bits);
出力は4になります。その背後にある説明は何ですか?
また、C ++でビット単位のスペースを割り当てる方法はありますか?
次のように概算できますsizeof(bitset<N>)
。
4 * ((N + 31) / 32)
8 * ((N + 63) / 64)
最初は本当のようです:4 * ((3 + 31) / 32)
です4
出力は 4 です。その背後にある説明は何ですか?
bitset
どのように実現すべきかについての情報は規格にありません。これは実装定義bitset header
です。コンパイラを見てください。
また、C++ でビット単位でスペースを割り当てる方法はありますか?
いいえ、C++ でビット単位でスペースを割り当てる方法はありません。
CPU は個々のビットではなく、バイトとワードで動作します。あなたの場合、コンパイラはこのデータ構造を 4 バイトに揃えることを決定したため、sizeof(bits) の結果は 4 になります。
通常、32 ビット プロセッサでは、コンパイラは割り当てられたメモリ サイズを 4 バイトの倍数にするため、3/8 より大きい最も近い 4 の倍数は 4 バイトです。
個別のビットをアドレス指定することはできません。アドレス指定可能な最小単位はバイトです。いいえ、ビットを正確に割り当てることはできません。
もう 1 つはパディングです。ほとんどの場合、要求したよりも多くのバイトが割り当てられます。これは最適化のためです。32b 境界にないバイトのアドレス指定は多くの場合、コストがかかります。x64 CPU で 64b 境界にないバイトのアドレス指定を行うと、例外が発生します。(Intelプラットフォームといえば。)