以下与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下载的一部分。
无论如何,容器必须有这些成员:
char*
的4个字节。size_t
或char*
为4个字节。size_t
或char*
为4个字节。[[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
派生自一个具有此类数据成员的base:
struct _Vector_impl
: public _Tp_alloc_type
{
pointer _M_start;
pointer _M_finish;
pointer _M_end_of_storage;
...
_M_end_of_storage
支持.capacity()
/ resizing等。