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>

  • 在测试sizeofvector<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的返回值不建议做任何提前假设。

Reference

Last Updated: 11/20/2018, 7:01:29 AM