2016-12-06 5 views
9

Вопрос на самом деле прост (спросить), std::bitset<32> - это то же самое, что и uint32_t для памяти? Или это больше похоже на std::array<bool, 32>?В: Как биты внутри?

я обычно делаю что-то вроде:

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 <> не работает.

С учетом этого мы рассмотрим разницу между двумя фрагментами кода выше.

В C++ a bitfield не является дискретным объектом. Это имеет важные последствия для многопоточного кода.

Это связано с тем, что C++ 11 и более гарантирует, что незащищенный доступ из двух потоков к двум дискретным объектам безопасен, но доступ одного и того же неконстантного объекта к двум более новым потокам - это гонка данных, если она не защищена мьютексом ,

В приведенном выше bitset кода, было бы правильнее сказать:

thread1: index = 10;

thread2: auto x = magic;

Поскольку они являются дискретными объектами и, следовательно, гарантируется не вызывать скачки данных при доступе из разные потоки.

В поле bitfield это не было бы безопасно. Обновление индекса - это гонка с чтением магии, и это неопределенное поведение.

+0

Вы правы. Я забыл многопоточную импликацию. Я знаю, что битпольная доля памяти. Тогда, если я собираюсь сделать многопоточный код, я должен посмотреть, как этот код будет работать, прежде чем выбирать между битрейтом или битовым полем. –

+0

@MathieuVanNevel Лучший совет, который я могу предложить, - избегать битполей вообще, если вы не пишете на ввод-вывод с памятью. –

+0

ну, я все равно попытаюсь удалить бит-бит для битов. Я понимаю, почему alexeykuzmin0 сказал «да», но вы правы, это неправильный ответ на этот вопрос. Не знаю, почему Stargateur был настолько downvote. –

2

Немного поля нужно на структуру

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

так что это не то же самое, что

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

"Multiple adjacent bit fields are usually packed together (although this behavior is implementation-defined): ".

У вас есть два std :: bitset, поэтому они не могут использовать одну и ту же память, поэтому это не одно и то же.

+0

Если вы не согласны с тем, почему вы не говорите, почему. Я открываю ваш аргумент. – Stargateur

+0

Я не понимаю, на что вы пытаетесь ответить. Вопрос задает вопрос о том, как реализован «битсет», и вы начинаете сравнивать их с битовыми полями. Нет, где я вижу, как OP спрашивает о различии между битовыми полями и 'bitset'. – NathanOliver

+0

@NathanOliver он задает два вопроса, я отвечаю на второй.Я единственный, кто прочитал все вопросы? – Stargateur

Смежные вопросы