问题 sizeof()std :: vector(C ++)


关于这个话题已有一个话题,但我仍有疑虑。要计算向量的大小,哪一个是正确的:

sizeof(VEC) + sizeof(int) * VEC.capacity()

要么

VEC.capacity() * (sizeof(VEC) + sizeof(int))

10208
2018-01-08 13:52


起源

可能重复 sizeof()一个向量 - Joe
@jrok:这只是一个猜测,取决于实现的工作方式。 - Dietrich Epp


答案:


你对矢量的大小是什么意思?矢量对象的大小就是

sizeof(vec);

如果您对向量在堆上分配了多少内存感兴趣,可以使用

vec.capacity()*sizeof(T)

所以,如果你添加这些,你会得到你因为向量而“丢失”了多少内存。

vec.capacity()*sizeof(T) + sizeof(vec)

请注意,确切分配了多少内存取决于实现。这就是上面的公式 几乎 在大多数(如果不是全部)实现中纠正(或近似正确)。


15
2018-01-08 13:54



这只是一个猜测,取决于实现的工作方式。 - Dietrich Epp
@Dietrich:你真的看过我的回答吗? - Armen Tsirunyan
我认为,考虑到如何限制 vector  能够 有效实施,这是正确的 下限 关于记忆的数量a vector 及其内容占据。 +1。 - Fred Foo
但是,如果成员和类型的数量相同,那么为动态数组和向量分配的内存似乎是相同的。 - Shibli
相对于该 几乎 正确:实施的“最佳”方法 std::vector<T> 是让实际对象存储指针 T 这是一个指向元素开头的指针,并具有控制数据( std::vector<T>的大小,容量和分配器)紧接在值之前。这种方法不一定是可移植的,但它不是必须的 std::vector<T> 是实施的一部分。除了控制数据外 std::vector<T> 内存管理系统通常还会在分配内存前添加几个字节。 - Dietmar Kühl


如果您想知道向量中包含的数据的大小

std::vector<int> vec;
...
vec.size() * sizeof(decltype(bufferIn)::value_type))

如果类型从int更改为long long,则不必更改其他任何内容。我发现这个解决方案比使用sizeof中的类型更安全,因为它可以很容易地在没有另一个的情况下进行更改。

std::vector<long long> vec; // lets go from int to int64
...
vec.size() * sizeof(int); // woops problem on the horizon

0
2018-03-10 01:14