c++ - 空 vector 的大小

标签 c++ vector iterator sizeof g++4.8

以下在 g++ 4.8.2 上运行的程序在 32 位 Linux 系统上给出了输出 12:

vector<char> v;
cout << sizeof(v) << endl;

我看到了this并且知道 sizeof(v) 可能是特定于实现的。不过,我想知道是什么导致该 vector 的大小为 12。我认为迭代器 v.begin()v.end()可能贡献了 8 个字节的大小。我对么?如果是,剩余 4 个字节大小的贡献是什么?如果不是,这 12 个字节是什么意思?

最佳答案

查看源代码。 libstdc++ 是 gcc 下载的一部分。

无论如何,容器必须有这些成员:

  1. 一个数据指针,4 个字节用于 char*
  2. 元素计数或结束指针,size_tchar* 为 4 个字节。
  3. 缓冲区大小或指向缓冲区末尾的指针,size_tchar* 为 4 个字节。
  4. 标准分配器(空的普通类型)不需要空间,这要归功于一些实现技巧(空基类优化,可能还有部分模板特化。C++20 可以使用 the attribute [[no_unique_address]] 代替)。

理论上,如果不是指针,2 和 3 可能更小。虽然这会很奇怪,因为它会限制最大尺寸。

同样在理论上,2 和 3 可以随数据动态分配。不过还没有发现有人真正这样做过。

一共 12 个字节,符合预期。
将 64 位实现的大小加倍。

关于c++ - 空 vector 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27935802/

相关文章:

c++ - make_heap() 函数如何工作?

c++ - 重载自定义迭代器的取消引用运算符

java - 如何创建自定义哈希表迭代器?

c++ - 如何检查两个矩阵是否相同?

c++ - 按元素复制 std::vector 比移动整个 vector 更优化

java - JNI : javah mangles arguments that are inner classes

r - 如何创建没有NULL/NA的错误向量?

java - 为什么这个 Hashmap 迭代不起作用?我收到 NullPointerException

c++ - C++ lambda 如何/可以保留内部状态?

c++ - 如何使用 C++ Expects 运算符?