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)
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;
因为它们是离散对象,因此保证在从不同线程访问时不会导致数据争用.
在位域代码中,这不安全.索引的更新将是一个具有魔法读数的竞赛,这是未定义的行为.