问:里面的位置如何?

Mat*_*vel 9 c++ bit-manipulation bitset

问题很简单(要问),与记忆std::bitset<32>是一回事uint32_t吗?或者更像是std::array<bool, 32>

我经常这样做:

uint32_t  index : 20;
uint32_t  magic : 12;
Run Code Online (Sandbox Code Playgroud)

那么它和这段代码一样吗?

std::bitset<20>  index;
std::bitset<12>  magic;
Run Code Online (Sandbox Code Playgroud)

Ric*_*ges 7

uint32_t  index : 20;
uint32_t  magic : 12;
Run Code Online (Sandbox Code Playgroud)

那么它和这段代码一样吗?

std::bitset<20>  index;
std::bitset<12>  magic;
Run Code Online (Sandbox Code Playgroud)

绝对不是,了解差异非常重要.

首先,std :: bitset <>的内部表示在实现中.

有了这个,我们应该检查上面两个代码片段之间的差异.

在c ++中,位域不是离散对象.这在多线程代码中具有重要意义.

这是因为c ++ 11及更高版本保证从两个线程到两个离散对象的无保护访问是安全的,但是除非受互斥锁保护,否则两个以上线程对同一个非const对象的访问是数据竞争.

在上面的bitset代码中,它是正确的说:

线程1: index = 10;

线程2: auto x = magic;

因为它们是离散对象,因此保证在从不同线程访问时不会导致数据争用.

在位代码中,这不安全.索引的更新将是一个具有魔法读数的竞赛,这是未定义的行为.