c++ - 为什么 "std::vector<bool>"的大小是 16 Byte?

标签 c++ vector boolean

我正在使用 memcpy 将 std:vectors<> 的内容复制到原始数组。对于 int、float、double 等数据类型,它运行良好。当我开始复制 boolvector 时,我遇到了一个问题,即我得到了奇怪的值。

首先,我开始为浮点 vector 制作测试输出:

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 字节。当我为 bool 执行此操作时,输出如下所示:

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

为什么 bool 的大小是 16 Byte?对我来说,这似乎太过分了。对此有解释吗?

最佳答案

不同于vector的其他专业, vector<bool>不管理 bool 的动态数组对象。相反,它应该将每个 boolean 值打包成一个位。

由于单个位不可寻址,test[0]不能简单地引用 bool .相反,它是一个类类型 vector<bool>::reference可以转换为 bool (获取值),并从 bool 分配(修改 vector 元素)。

这意味着vector<bool>不完全满足标准容器的要求,如果您需要对其元素的引用或指针,则不能使用。如果您确实需要具有可寻址元素的“真实”容器,请考虑 vector<char>deque<bool>相反。

关于c++ - 为什么 "std::vector<bool>"的大小是 16 Byte?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15809157/

相关文章:

c++ - 无法编译 brian gladman aes 库

c++ - 重载成员函数指针的转换助手

c++ - QtCreator——显示一个类的成员函数列表?

c++ - 为什么在 operator< 存在时定义 lt?

C++:什么时候在最后一条语句之前调用析构函数?

c++ - 在 C++ 中显示字符串 vector

c++ - 我怎样才能指向 vector 元素?

javascript - 当用户拒绝共享位置时,Google map 不会初始化

c - C中是否有bool的格式说明符?

python - Pandas 数据帧阈值——如果超过则保持数字固定