关于std::vector<int>对象sizeof结果为24的成员构成疑问
关于std::vector对象大小的疑问
std::vector<int> v; sizeof(v) // 输出为24
我测试时发现上述代码中sizeof(v)的输出是24,搜索到的答案说这是因为std::vector包含两个指针和一个size_t类型的数据成员(8×3=24),但我查阅它的公共类型定义时,发现远不止这几个成员类型,想知道我是不是忽略了什么细节?
// 公共类型定义 typedef _Alloc allocator_type; typedef __gnu_cxx::__normal_iterator<const_pointer, vector> const_iterator; typedef _Tp_alloc_type::const_pointer const_pointer; typedef _Tp_alloc_type::const_reference const_reference; typedef std::reverse_iterator<const_iterator> const_reverse_iterator; typedef ptrdiff_t difference_type; typedef __gnu_cxx::__normal_iterator<pointer, vector> iterator; typedef _Tp_alloc_type::pointer pointer; typedef _Tp_alloc_type::reference reference; typedef std::reverse_iterator<iterator> reverse_iterator; typedef size_t size_type; typedef _Tp value_type;
你混淆了类型定义(typedef)和类的数据成员这两个完全不同的概念:
你贴出的这些
typedef只是给现有类型起的别名,属于类的类型成员,不会占用vector对象的内存空间。这些类型定义是为了让开发者更便捷地使用vector的相关类型(比如迭代器、指针类型),本质上只是编译期的语法糖,对对象大小没有任何影响。sizeof(v)计算的是vector对象本身的内存占用,也就是它的非静态数据成员所消耗的空间。在GCC的实现中,std::vector的核心数据成员通常是三个:- 指向数据缓冲区起始位置的指针(64位系统下占8字节)
- 指向缓冲区末尾下一个位置的指针(8字节)
- 记录当前元素数量的
size_t类型变量(8字节)
三者总和正好是24字节,和你测试得到的结果一致。
补充说明:不同编译器的vector实现可能存在细微差异,但核心都是通过少量成员管理底层内存,类型定义不占用对象内存这一点是C++标准里的通用规则。
内容的提问来源于stack exchange,提问作者Taha Exo
相关产品推荐
相关产品推荐

