以下使用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个字节到底是什么?
答案 0 :(得分:9)
看看消息来源。 libstdc++
是gcc下载的一部分。
无论如何,容器必须有这些成员:
char*
的4个字节。size_t
或char*
为4个字节。size_t
或char*
为4个字节。[[no_unique_address]]
代替)。 / LI>
醇>
理论上,如果不是指针,2和3可能会更小。虽然这会很奇怪,因为它会限制最大尺寸。
同样在理论上,2和3可以与数据动态分配。但是没有发现任何人真的那么做。
如预期的那样共12个字节 将64位实现的大小加倍。
答案 1 :(得分:3)
通常std :: vector有:
1. Start of allocation / begin
2. End of vector (begin + size)
3. End of allocation (begin + capacity)
因此,在32位机器上,12号尺寸非常合理。
答案 2 :(得分:1)
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()
/调整大小等。