カスタム ビット フィールドを配置できる 96 ビット長の構造体が必要です。フィールドの長さはいたるところにあります8
, 3
, 26
, 56
. これらの正確な長さを維持することが重要です (1 つの例外を除き、以下を参照してください)。
データを 1 つのコンパクトなフィールドに連結する方法は数多くstd::bitset
ありstruct
ますint
。でも:
操作は非常に高速に行われる必要があるため、この
bitset
アプローチには問題があります。bitset は、1 つのアトミック操作で、(x..y)
範囲全体から範囲を即座に設定する方法を提供しません。(0..96)
個々のビットを設定するためにループするつもりなら、いまいましい。この長さの制限のため、この
struct
アプローチには問題があります。十分な長さがないため、この
int
アプローチには問題があります。int64_t
もちろん、int32_t
これと一緒に使用できますが、以下を参照してください。
明らかな解決策の 1 つは、56 + 8
フィールドをに入れint64_t
、残りを に入れることint32_t
です。ここでの問題は、56
-long フィールドだけが実際には開発の後半で縮小される可能性があるということです。これはint64_t
、 にいくつかの32 - (26 + 3) = 3
スペア ビットとint32_t
.
これらを(コードの観点から)できるだけコンパクトに格納しながら、(とは異なりstd::bitset
)マスキングによって広い領域にアクセスできる方法はありますか?