c++ - カスタムデータ型は、可変サイズの効率のための可能で実行可能なオプションですか?

原文 c++ mmo data-structures

単一のブール値をバイトブロックに格納する代わりに、8つのブール値を同じブロックに格納してみませんか。

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

これはうまくいくでしょうか?

もっと良い方法はありますか?

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

これはネットワーキングに大きな影響を与えるでしょうか?
答え
あなたが説明したことはしばしばbit fieldsと呼ばれます。それらは、スペースが(ビットおよびバイトのレベルで)プレミアムである場合、または実際に何かを縮小しようとしている場合に使用されます。これには以下が含まれます(ただし、これらに限定されません)。


圧縮アルゴリズム
オーバーヘッドを制限するための汎用プロトコル
作業データを縮小してキャッシュに合わせる


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

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


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

質問にもっと直接答えるために、オーバーヘッドの非常に少ないネットワークプロトコルで作業しているのでない限り、ビットフィールドを使用する必要があることはほとんどありません。スペースの節約は、ネットワークの通常の時間スケールと比較して最小限であり、本当に心配している場合は、protocol buffersのような既成のソリューションを使用したほうがよいでしょう。
関連記事

c++ - このC++プログラムにコマンドライン入力を与える方法

c++ - C++とFortranの並列MM速度差ループタイリング

c++ - リンクリストで変更されたデータはメモリに反映されません

c++ - Qtでマウスイベントが発生したときに呼び出される関数の宣言

c++ - OpenCVでのレーン検出器分割線C++

c++ - 誤った値を返す二重ハッシュ関数

c++ - C++プロキシDLL(64ビット)

java - Android Gstreamer SDKでANativeWindow_lockがエラー-22を返す

c++ - doxygenの「ファイルドキュメント」リストから「README.md」を除外します

java - 最小の「XOR」演算でバイナリマトリックスを再作成する