sizeof(vector<type>)
sizeof作用于vector和string对象
- 由于我们知道C++标准仅规定了
sizeof(char)
,sizeof(char8_t)
,sizeof(signed char)
和sizeof(unsigned char)
的返回值为1,但是对于其他情况的返回值依赖于计算机硬件平台,以及编译器的设置。只有对string对象或vector对象执行sizeof运算只返回该类型固定部分的大小,不会计算对象中的元素占用了多少空间。
所谓固定部分,也就是指vector或string对象在创建时,即使为空时也存在的对象。比如创建vector<int>
对象会产生指针或size_t等用于实现的部分。
vector<int>
- 在测试
sizeof
对vector<type>
值的时候发现,sizeof<bool>
的值大于其他sizeof<type>
的值。在VS2017 Community中可以看到vector<int>
是有3个int*
指针,分别用于指向第零元素,指向尾元素,指向对象最大存储空间的end:
而vector<bool>
除了有3个unsigned int*
指针以外,还有一个_unsigned_int64
的_Mysize
变量:
- 造成这一结果的原因是,
vector<bool>
在早期就被设计出来了,并不是一个STL容器,而早期的时候为了优化性能,vector对象里的并不是和bool
对象一样是以byte的形式存储的,而是以bit位的形式存储的,因此使得其vector<bool>
的元素并不是顺序存储的,也就是说并不能通过尾迭代器和首迭代器的差值来获得vector<bool>
的元素个数,因此需要有一个专门变量用于统计元素个数。而C++标准并未编译器必须执行这一优化,也就是说是否对vector<bool>
进行上述优化,取决于编译器。也正因为这一历史遗留原因带来的不可控,并不提倡在C++中使用vector<bool>
。
Summary
由于sizeof
的平台依赖性,对于sizeof的返回值不建议做任何提前假设。