【发布时间】:2013-03-26 09:45:09
【问题描述】:
我正在使用 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 字节。当我为 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?对我来说,这似乎完全是矫枉过正。对此有解释吗?
【问题讨论】:
-
&test[0]不是你想象的那样。检查它的类型! -
您的标题具有误导性,您从未真正检查过
std::vector<bool>的大小。 -
您不能使用小于一个字符的
sizeof。sizeof运算符以字符大小的整数倍返回大小。 -
@DavidSchwartz:是的,但这并不能解释为什么它是 16 个字节而不是 1 个。
-
@DavidSchwartz:除非假设
test[0]是对bool的引用,就像test1[0]是对float的引用一样——如果你不知道,这是一个相当合理的假设关于vector<bool>专业化。bool本身并不是“小于一个字符”,如果大于这个值,会让人感到惊讶。