以下程序在g++ 4.8.2
32 位 Linux 系统上运行时给出了输出 12:
vector<char> v;
cout << sizeof(v) << endl;
我看到了这一点,并且知道这sizeof(v)
可能是特定于实现的。不过,我想知道是什么可能导致该向量的大小为 12。我认为迭代器v.begin()
可能v.end()
会导致 8 个字节的大小。我对么?如果是,是什么导致了剩余 4 个字节的大小?如果不是,那么这 12 个字节到底是什么?
看看来源。libstdc++
是 gcc 下载的一部分。
无论如何,容器必须有这些成员:
char*
。size_t
或4 个字节char*
。size_t
或4 个字节char*
。[[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()
/调整大小等。