4

私の意見では、 のようなバイナリ変数に必要なのは 1 ビットだけですboolboolすべての s に 1 ビットのみを使用するように明示的に指示することは、何らかの方法で悪い決定ですか?

struct Banana { 

    // little fields
    bool on_off : 1;
    bool yes_no : 1;
    bool left_right : 1;
    bool alive_dead : 1;
    bool in_out : 1;

};

編集:

フィールドのアドレスを取得できないことはわかっています。その他の欠点はありますか?

4

3 に答える 3

6

これらのものがたくさんあれば、スペースを節約できます。ただし、通常の 1 バイト ソリューションに対して、クリア/セット/チェック操作ごとに少なくとも追加のANDor命令が追加されます。OR

全体のスキームでは、実際に巨大な数を持っていない限り、おそらくメリットはありません.

于 2013-08-15T09:21:56.147 に答える
3

時間/空間/同期のトレードオフがあります。

明らかに、同じスペースに 32 倍のビットを格納できます。

ただし、個々の bool にアクセスするには、少なくともマスキング操作と、おそらくシフトが必要です (ただし、特定の状況下では、最適化される可能性があります)。

更新の単純な書き込みを読み取り/変更/書き込みに変更したため、制御の複数のスレッドがブール値を変更しようとすると、結果が生じるため、同期を追加する必要があります。

于 2013-08-15T09:41:28.103 に答える
2

ブール値をビットフィールドに移動することでコードの品質とパフォーマンスが大幅に向上した、いくつかの優れたコンパイラ/アーキテクチャ/関数に遭遇しました。

残念ながら、GCC はそれらのコンパイラの 1 つではありません (または、前回これをテストしたときもそうではありませんでした)。

うまくいけば、複数のブール値を 1 つのレジスタに格納することで、多くのレジスタ プレッシャーを軽減できます。その結果、スタックへの多くのレジスタ スピルがなくなり、コードの残りの部分がはるかに効率的になります。

アーキテクチャにビット処理命令の適切なセットがある場合、テストおよび操作操作は、レジスタ全体またはさらに悪いことにスタックからブール値を抽出する同等の操作よりもコンパクトまたはコンパクトにすることができます。

一般に (x86 でも)、ビット パッキング ブール値はより効率的なコードになるはずですが、制限はコンパイラです。

于 2013-08-15T09:50:07.490 に答える