空向量的大小
Size of empty vector
运行 g++ 4.8.2
上的以下程序在 32 位 Linux 系统上给出了输出 12:
vector<char> v;
cout << sizeof(v) << endl;
我看到 this 并且知道 sizeof(v)
可能是特定于实现的。不过,我想知道是什么导致该向量的大小为 12。我认为迭代器 v.begin()
和 v.end()
可能会导致大小为 8 个字节。我对么?如果是,剩余 4 个字节大小的贡献是什么?如果不是,这12个字节是什么意思?
查看源代码。 libstdc++
是 gcc 下载的一部分。
无论如何,容器必须有这些成员:
- 一个数据指针,4 个字节用于
char*
。
- 元素计数或结束指针,
size_t
或 char*
的 4 个字节。
- 缓冲区大小或指向缓冲区末尾的指针,
size_t
或 char*
为 4 个字节。
- 标准分配器(空的平凡类型)不需要 space,这要归功于一些实现技巧(空基类优化,也许还有部分模板特化。C++20 可以使用 the attribute
[[no_unique_address]]
代替)。
理论上,如果不是指针,2 和 3 可能更小。虽然这会很好奇,因为它会限制最大尺寸。
同样在理论上,2 和 3 可以随数据动态分配。不过还没有发现有人真正这样做过。
一共 12 个字节,符合预期。
将 64 位实现的大小加倍。
通常 std::vector 有:
1. Start of allocation / begin
2. End of vector (begin + size)
3. End of allocation (begin + capacity)
所以大小 12 在 32 位机器上是非常合理的。
libstdc++ 的 std::vector
派生自具有此类型数据成员的基:
struct _Vector_impl
: public _Tp_alloc_type
{
pointer _M_start;
pointer _M_finish;
pointer _M_end_of_storage;
...
_M_end_of_storage
支持 .capacity()
/ 调整大小等..
运行 g++ 4.8.2
上的以下程序在 32 位 Linux 系统上给出了输出 12:
vector<char> v;
cout << sizeof(v) << endl;
我看到 this 并且知道 sizeof(v)
可能是特定于实现的。不过,我想知道是什么导致该向量的大小为 12。我认为迭代器 v.begin()
和 v.end()
可能会导致大小为 8 个字节。我对么?如果是,剩余 4 个字节大小的贡献是什么?如果不是,这12个字节是什么意思?
查看源代码。 libstdc++
是 gcc 下载的一部分。
无论如何,容器必须有这些成员:
- 一个数据指针,4 个字节用于
char*
。 - 元素计数或结束指针,
size_t
或char*
的 4 个字节。 - 缓冲区大小或指向缓冲区末尾的指针,
size_t
或char*
为 4 个字节。 - 标准分配器(空的平凡类型)不需要 space,这要归功于一些实现技巧(空基类优化,也许还有部分模板特化。C++20 可以使用 the attribute
[[no_unique_address]]
代替)。
理论上,如果不是指针,2 和 3 可能更小。虽然这会很好奇,因为它会限制最大尺寸。
同样在理论上,2 和 3 可以随数据动态分配。不过还没有发现有人真正这样做过。
一共 12 个字节,符合预期。
将 64 位实现的大小加倍。
通常 std::vector 有:
1. Start of allocation / begin
2. End of vector (begin + size)
3. End of allocation (begin + capacity)
所以大小 12 在 32 位机器上是非常合理的。
libstdc++ 的 std::vector
派生自具有此类型数据成员的基:
struct _Vector_impl
: public _Tp_alloc_type
{
pointer _M_start;
pointer _M_finish;
pointer _M_end_of_storage;
...
_M_end_of_storage
支持 .capacity()
/ 调整大小等..