1

重複の可能性:
1 バイトの bool。なんで?

クラスにブール変数を追加したい。ただし、このクラスはサイズにかなり敏感なので、別のフィールドを追加するのは気が進まない。ただし、少なくともchar幅が広く、その他の 1 つのメンバーの山で構成されていboolます。

このコードを手書きする場合、これらのブール フィールドをオブジェクトの最後のバイト程度のビットとして実装します。アクセスはバイト単位で整列する必要があるため、これによって空間的なオーバーヘッドが発生することはありません。

さて、コンパイラは通常、このトリックを行いますか? 私がそうしないことができる唯一の理由は、そこからそのビットを取得するために追加のマスクが必要になるためです.

4

3 に答える 3

3

いいえ、各メンバーのアドレスは異なる必要があるため、コンパイラはこのトリックを実行できません。固定数のビットをパックする場合は、 を使用しますstd::bitset。可変ビット数が必要な場合は、 を使用しますboost::dynamic_bitset

于 2013-01-30T23:48:08.987 に答える
2

いいえ、bool を少し最適化するコンパイラを知りません。

次の方法でこの動作を強制できます。

unsigned int m_firstBit : 1;
unsigned int m_secondBit : 1;
unsigned int m_thirdBit : 1;

そうでない理由については、言語の保証に違反する可能性があります。たとえば、独自の予約バイトを持たない if&myBoolを取る関数に渡すことはできません。bool*

于 2013-01-30T23:43:48.070 に答える
0

通常、コンパイラはこれを行いませんが、std::bitset<2>2 つの bool を 1 バイトにパックするために使用できます。

于 2013-01-30T23:47:59.307 に答える