为什么"std::vector<bool>"的大小是 16 字节?
Why is the size of "std::vector<bool>" 16 Byte?
我正在使用memcpy将std:vectors的内容<>复制到原始数组。对于 int、float、double 等数据类型,它运行良好。当我开始复制布尔向量时,我遇到了一个问题,即我得到了奇怪的值。
首先,我开始为浮点向量制作测试输出:
std::vector<float> test1 (3,0);
cout << "Sizeof test1[0] : " << sizeof(test1[0]) << endl
<< "Memoryaddress 0: " << &test1[0] << endl
<< "Memoryaddress 1: " << &test1[1] << endl
<< "Memoryaddress 2: " << &test1[2] << endl;
输出为:
Sizeof test1[0]: 4
Memoryaddress 0: 02793820
Memoryaddress 1: 02793824
Memoryaddress 2: 02793828
这就是我所期望的。浮点数大小为 4 字节,到下一个浮点值的距离为 4 字节。当我对布尔值执行此操作时,输出如下所示:
std::vector<bool> test (3,0);
cout << "Sizeof test[0]: " << sizeof(test[0]) << endl
<< "Memoryaddress 0: " << &test[0] << endl
<< "Memoryaddress 1: " << &test[1] << endl
<< "Memoryaddress 2: " << &test[2] << endl;
输出为:
Sizeof test[0]: 16
Memoryaddress 0: 011EF94C
Memoryaddress 1: 011EF93C
Memoryaddress 2: 011EF92C
为什么布尔值的大小是 16 字节?这对我来说似乎完全是矫枉过正。对此有解释吗?
与vector
的其他特化不同,vector<bool>
不管理bool
对象的动态数组。相反,它应该将布尔值打包到每个位中。
由于单个位不可寻址,因此test[0]
不能简单地引用bool
。相反,它是一个类类型vector<bool>::reference
,可以转换为 bool
(获取值(,并从 bool
赋值(修改向量元素(。
这意味着 vector<bool>
并不完全满足标准容器的要求,如果需要引用或指向其元素的指针,则无法使用。如果确实需要具有可寻址元素的"真实"容器,请考虑vector<char>
或deque<bool>
。
std::vector<bool>
是矢量的专用版本,它针对空间进行了优化。
- 存储
- 不一定是布尔值数组,但库实现可以优化存储,以便每个值存储在单个位中。
- 元素不是使用分配器对象构造的,而是直接在内部存储中的正确位上设置它们的值。
详细信息:http://www.cplusplus.com/reference/vector/vector-bool/
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 写入向量<向量<bool>>
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 在UNIX系统中使用DIR查找文件的字节大小
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- std::当在256字节边界上写入整数时,流的奇怪行为
- 当比特(而不是字节)的顺序至关重要时的持久性
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 如何在文件中查找字节序列
- luaL_dofile在已知良好的字节码上失败,可以使用未编译的版本
- 字节到位运算符重载C++
- 在java中读取c++字节的位字段
- 让bool方法返回其他整数
- 使用 std::vector::reverse_iterator 将 int 序列化为字节向量?
- 字节真的是最小可寻址单元吗
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- 读取文件中所有可能的十六进制 16 字节序列并打印每个序列
- 为什么 bool 和 _Bool 如果它们在内存中占用 1 个字节,它们只能存储 0 或 1
- 为什么"std::vector<bool>"的大小是 16 字节?
- 如何检查向量是否<bool>实际上是位而不是字节的向量?