2

単一のブール値をバイト ブロックに格納する代わりに、同じブロックに 8 つのブール値を格納しないでください。

例: 01010101 = 8 ブール、1 3 5 7 = false、2 4 6 8 = true。

これは機能しますか?

より良い方法はありますか?

これを行うことの長所と短所は何ですか?

これはネットワーキングに大きな影響を与えますか?

4

2 に答える 2

0

vector<bool>スペース効率を考えて設計されているので、この目的に使用できます。

vector<bool>は、実際のブール値ではなく、スペースを節約するように設計されたブール値のパック表現を含む疑似コンテナーです。典型的な実装では、「ベクトル」に格納された各「ブール値」は 1 ビットを占有し、8 ビットのバイトは 8 つの「ブール値」を保持します。

しかし、このアプローチには問題があります:-

ベクトル内の個々の bool に対処したい場合は、次のようにします。

vector<bool> v;
bool *pb = &v[0];

しかし、実際にはベクトルに bool はありません。これは、ある時点で個々のブール値を参照する必要があるため、ネットワークの傘下で実装すると問題が発生する可能性があります。

于 2014-11-28T05:34:29.613 に答える
0

あなたが説明したものは、ビットフィールドと呼ばれることがよくあります。スペースが貴重な場合 (ビットおよびバイト レベル)、または実際に何かを縮小しようとしている場合によく使用されます。これには以下が含まれます (ただし、これらに限定されません)。

  • 圧縮アルゴリズム
  • オーバーヘッドを制限するための汎用プロトコル
  • キャッシュに収まるように作業データを縮小する

それ以外の場合は、プログラミングの他のほとんどの問題と同様に、そのような低レベルの詳細を処理するソリューションを使用するか、人間にとってコードをできるだけ単純に保つ方がよいでしょう。bool場合によっては、コードの意図を説明するプレーンな s に固執することを意味します。ただし、言語とコード ベースがビット フィールドを簡単にサポートする場合は、それも問題ありません。完全を期すために、C/C++ は次の構造体コロン構文を介してビット フィールドをネイティブにサポートします。

struct Foo {
    char f1 : 1;
    char f2 : 1;
    char f3 : 1;
    // ...
};

... コロンの後の数字は、フィールドが使用するビット数を表します。もありますvector<bool>が、最近ではほとんど使用されていない問題のあるタイプであり、不器用でもあります。

質問にもっと直接的に答えるために、オーバーヘッドが非常に低いネットワーク プロトコルで作業している場合を除き、ビット フィールドを使用する必要がある可能性はほとんどありません。スペースの節約は、ネットワーキングの通常の時間スケールと比較して最小限です。本当に心配している場合は、プロトコル バッファなどの既製のソリューションを使用することをお勧めします。

于 2014-11-28T05:37:15.803 に答える