uint32_t index : 20;
uint32_t magic : 12;
だから、このコードと同じですか?
std::bitset<20> index;
std::bitset<12> magic;
絶対にありません、それはあなたが違いを理解することが非常に重要です。
最初に、std :: bitset <の内部表現は、実装の中止です。
上記の2つのコードスニペットの違いを調べる必要があります。
C++でビットフィールドは個別オブジェクトではありません。これは、マルチスレッドコードで重要な意味を持ちます。
これは、2つのスレッドから2つの個別のオブジェクトへの保護されていないアクセスは安全ですが、2つ以上のスレッドによる同じ非constオブジェクトへのアクセスは、 。
上記bitset
のコードでは、言うことが正しいだろう。
スレッド1:index = 10;
スレッド2:auto x = magic;
彼らは個別のオブジェクトであり、からアクセスするため、データ競合が発生しないことが保証ので異なるスレッド。
ビットフィールドコードでは、これは安全ではありません。インデックスの更新は、魔法の読書との競争であり、これは未定義の動作です。
あなたは正しく私はマルチスレッド含意を忘れています。私はそのビットフィールド共有メモリを知っています。次に、マルチスレッドコードを実行する場合、ビットセットまたはビットフィールドのどちらかを選択する前にコードがどのように動作するかを調べる必要があります。 –
@MathieuVanNevel私が提供できる最善のアドバイスは、メモリマップされたI/Oに書き込むのでなければ、ビットフィールドを完全に避けることです。 –
私はビットセットのビットフィールドをとにかく削除しようとしています。私はなぜalexeykuzmin0がはいと言ったのか理解していますが、あなたは正しいです。それはこの質問の正しい答えではありません。 Stargateurがそんなにdownvoteだった理由を知らないでください。 –