2016-12-06 10 views
9

質問は本当に簡単です(質問する)、std::bitset<32>はメモリのためのuint32_tと同じものですか?それとも、std::array<bool, 32>のようなものですか?Q:ビットセットはどのように内部にありますか?

uint32_t index : 20; 
uint32_t magic : 12; 

だから、このコードと同じです:

私は通常のようなものがありますか?

std::bitset<20> index; 
std::bitset<12> magic; 

答えて

7
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;

彼らは個別のオブジェクトであり、からアクセスするため、データ競合が発生しないことが保証ので異なるスレッド。

ビットフィールドコードでは、これは安全ではありません。インデックスの更新は、魔法の読書との競争であり、これは未定義の動作です。

+0

あなたは正しく私はマルチスレッド含意を忘れています。私はそのビットフィールド共有メモリを知っています。次に、マルチスレッドコードを実行する場合、ビットセットまたはビットフィールドのどちらかを選択する前にコードがどのように動作するかを調べる必要があります。 –

+0

@MathieuVanNevel私が提供できる最善のアドバイスは、メモリマップされたI/Oに書き込むのでなければ、ビットフィールドを完全に避けることです。 –

+0

私はビットセットのビットフィールドをとにかく削除しようとしています。私はなぜalexeykuzmin0がはいと言ったのか理解していますが、あなたは正しいです。それはこの質問の正しい答えではありません。 Stargateurがそんなにdownvoteだった理由を知らないでください。 –

2

ビットのフィールドは、それが

std::bitset<20> index; 
std::bitset<12> magic; 

"Multiple adjacent bit fields are usually packed together (although this behavior is implementation-defined): "ことと同じではありません

struct { 
    uint32_t index : 20; 
    uint32_t magic : 12; 
} 

構造体を必要とします。

あなたは2つのstd :: bitsetを持っていますので、同じメモリを共有することはできません。同じことではありません。

+0

理由を言わない理由に同意しない場合。私はあなたの議論を開きます。 – Stargateur

+0

私はあなたが何を答えようとしているのか理解していません。質問は 'bitset'がどのように実装されているのかを質問し、それらをビットフィールドと比較し始めます。ビットフィールドとビットセットの違いについてOPに見てもらえません。 – NathanOliver

+0

@NathanOliver彼は2つの質問をします。私は2番目に答えます。私はすべての質問を読んだ唯一の人ですか? – Stargateur

関連する問題