作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
问题真的很简单(想问),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;
最佳答案
uint32_t index : 20;
uint32_t magic : 12;
So it's the same as this code ?
std::bitset<20> index;
std::bitset<12> magic;
绝对不是,了解其中的区别非常重要。
首先,std::bitset<> 的内部表示是向下实现。
除此之外,我们应该检查上面两个代码片段之间的区别。
在 C++ 中,位域 不是离散对象。这对多线程代码具有重要意义。
这是因为 c++11 和更高版本保证从两个线程对两个离散对象的无保护访问是安全的,但是另外两个线程对同一个非常量对象的访问是数据竞争,除非受到互斥体的保护。
在上面的 bitset
代码中,正确的说法是:
线程 1:index = 10;
线程 2:auto x = magic;
因为它们是离散对象,因此保证在从不同线程访问时不会导致数据竞争。
在位域 代码中,这是不安全的。索引的更新将是与读取魔法的竞赛,这是未定义的行为。
关于c++ - Q : How bitset are inside?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40996214/
我是一名优秀的程序员,十分优秀!