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

14

这个话题已经有人讨论过了,但我仍然有疑问。要计算向量的大小,哪一个是正确的:

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

可能是 sizeof() a vector 的重复问题。 - Joe
4
@jrok:这只是一种猜测,取决于实现方式。 - Dietrich Epp
2个回答

22
什么是向量的大小?向量对象的大小就是:
sizeof(vec);

如果您想知道向量在堆上分配了多少内存,可以使用以下方法:

vec.capacity()*sizeof(T)

因此,如果您添加这些内容,您将得到由于向量而“丢失”的内存量。

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

请注意,分配多少内存取决于实现。只是上面的公式在大多数情况下是准确的(或近似准确的)。

1
这只是一个猜测,取决于实现的方式。 - Dietrich Epp
1
我认为,考虑到vector能够有效实现的限制,这个给出了一个正确的vector及其内容所占据内存量的下限。+1。 - Fred Foo
@Armen:堆本身是一种实现细节(https://dev59.com/N2445IYBdhLWcg3wytMU) - Vlad
@Vlad:我知道,谢谢。但这是一个常见的术语,人们很容易理解。比“动态分配”更容易。 - Armen Tsirunyan
2
关于实际上正确的方法:实现std::vector<T>的“最佳”方法是让实际对象存储指向元素起始位置的T指针,并且让控制数据(std::vector<T>的大小、容量和分配器)紧随其后。这种方法不一定是可移植的,但由于std::vector<T>是实现的一部分,所以它不必是可移植的。除了std::vector<T>的控制数据之外,内存管理系统通常还会在分配的内存前面添加几个字节。 - Dietmar Kühl
显示剩余6条评论

4
如果您想知道向量中包含的数据大小。
std::vector<int> vec;
...
vec.size() * sizeof(decltype(vec)::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

很令人惊讶的是,目前还没有一种直接获取 vec.size() * sizeof(decltype(vec)::value_type) 的方法,尽管它相当冗长。 - kingsjester

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接