问题描述
以下使用 g ++ 4.8.2
运行的程序在32位Linux系统上给出了输出12:
The following program on running with g++ 4.8.2
gave the output 12 on a 32-bit Linux system:
vector<char> v;
cout << sizeof(v) << endl;
我看到并知道 sizeof(v)
可能是特定于实现的。不过,我想知道是什么原因导致该向量的大小为12.我认为迭代器 v.begin()
和 v.end()
可能会贡献8个字节的大小。我对么?如果是,那剩下的4个字节的大小是什么?如果没有,这12个字节到底是什么?
I saw this and know that sizeof(v)
could be implementation specific. Still, I was wondering what might be causing that vector to have a size of 12. What I think is that the iterators v.begin()
and v.end()
might be contributing to 8 bytes of the size. Am I correct? If yes, what is contributing to the remaining 4 bytes of size? If not, what are these 12 bytes all about?
推荐答案
看看来源。 libstdc ++
是gcc下载的一部分。
Take a look at the sources. libstdc++
is part of the gcc download.
无论如何,容器必须有这些成员(或者等同于所有成员)指针):
Anyway, the container must have these members (or equivalent, like all pointers):
- 数据指针,
char *
的4个字节。 - 元素计数或结束指针,
size_t
或char * $ c为4个字节$ c>。
- 缓冲区大小或指向缓冲区结尾的指针,4 $字节用于
size_t
或char *
。 - 标准分配器(空的普通类型)不需要空间,这要归功于一些实现技巧(Empty-baseclass-optimization,和也许是部分模板特化)。
- A data-pointer, 4 bytes for a
char*
. - An element count or an end pointer, 4 bytes for a
size_t
orchar*
. - A buffer-size or pointer to end-of-buffer, 4 bytes for a
size_t
orchar*
. - The standard allocator (empty trivial type) needs no space, thanks to some implementation-tricks (Empty-baseclass-optimization, and perhaps partial template-specialization).
理论上,如果不是指针,2和3可能会更小。虽然这会很奇怪,因为它会限制最大尺寸。
In theory, 2 and 3 might be smaller if not pointers. Though that would be curious, as it would restrict the maximum size.
正如预期的那样共12个字节。
Together 12 bytes, as expected.
这篇关于空矢量的大小的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!