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 это не было бы безопасно. Обновление индекса - это гонка с чтением магии, и это неопределенное поведение.
Вы правы. Я забыл многопоточную импликацию. Я знаю, что битпольная доля памяти. Тогда, если я собираюсь сделать многопоточный код, я должен посмотреть, как этот код будет работать, прежде чем выбирать между битрейтом или битовым полем. –
@MathieuVanNevel Лучший совет, который я могу предложить, - избегать битполей вообще, если вы не пишете на ввод-вывод с памятью. –
ну, я все равно попытаюсь удалить бит-бит для битов. Я понимаю, почему alexeykuzmin0 сказал «да», но вы правы, это неправильный ответ на этот вопрос. Не знаю, почему Stargateur был настолько downvote. –