なぜboolを使用せずにuint 8<変数名>:1を使用するのか


CPPプログラミングでは、次のようなコードが見られることが多い.変数名のみから見ると,符号化基準やbool変数と同様であり,実際の使用方法はbool変数と実際には同じである.
uint8 bBlockInput:1;
uint8 bCollideWhenPlacing:1;
uint8 bFindCameraComponentWhenViewTarget:1;
uint8 bGenerateOverlapEventsDuringLevelStreaming:1;
uint8 bIgnoresOriginShifting:1;
uint8 bEnableAutoLODGeneration:1;
uint8 bIsEditorOnlyActor:1;
uint8 bActorSeamlessTraveled:1;
しかし、これは明らかにbool変数ではありません.これはビットフィールド(bitfield)が宣言したものです.ビットフィールドは、次の構文で記述されます.
整数形式(列挙形式を含む)変数名:占有ビット数
ビットフィールドとして宣言された変数は整数形式です(uint 8、uint 16、...)このスペースを連続的に占有するビットフィールドで共有できます.すなわち、上記の8ビットフィールドはuint 8のメモリ領域(1 byte=8 bit)内部に1 bitずつ配置される.(詳細はMSDNのbit fieldを参照)
各変数をbool変数として宣言する場合は、1 byte(8 bit)*8=8 byte(64 bit)のメモリ領域が必要ですが、ビットフィールドを使用すると、1 byte(8 bit)空間に8つのbool変数を含めることができます.
一見、メモリ使用面積が大幅に減少し、bool変数よりも利点があるように見えますが、必ずしもそうではありません.
ビットフィールドは宣言と同時に値を初期化することはできません.ビットフィールドのアドレスを取得することはできません.non-cont参照変数をビットフィールドに初期化することはできません.
列挙型(enum)の場合、内部宣言されたメンバーの個数に応じて異なる桁数を設定します.例えば~2個が1~4個が2~8個が3のように
通常、ビットフィールドは、コードの可読性や使いやすさが悪いため、使用する必要はありませんが、クラスや構造がネットワークや最適化に関連している場合は、使用を考慮する必要があります.
参考資料
https://docs.microsoft.com/ko-kr/cpp/cpp/cpp-bit-fields?view=msvc-160