【问题标题】:Is an empty vector the size of its struct?空向量是其结构的大小吗?
【发布时间】:2013-11-13 10:51:12
【问题描述】:

假设我有一个这样的结构:

struct vertexNodeInfo
{
    unsigned char level;
    int node;
    double leaf;
};

如果我有这个:

vector<vertexNodeInfo> node;

在任何push_back 之前,空向量会有多大(内存方面,而不是.size)?它的大小会与vector&lt;int&gt; node; 完全相同(同样,就内存而言)?

【问题讨论】:

  • 它需要足够的空间来存储指向某些数据的指针、数据的大小或结尾以及它的容量。试试sizeof(std::vector&lt;int&gt;)。大小与它在任何给定时间拥有的元素数量无关。
  • @juanchopanza 其实我希望有人能告诉我。我正在编写一个复杂的 DLL,但我还不能编译它。我需要知道答案才能完成并编译,所以我无法使用sizeof 轻松测试。
  • @Clonkex 通常,不。学究式地,是的,它可能是,因为指向不同类型的指针的大小可能会有所不同。
  • 我认为 Ed 的意思是你通常不应该编写取决于空向量占用多少内存的代码。事实上,由于在标准中并不能保证您不能编写依赖于它的可移植代码。但即使有保证,也需要非常特殊的情况才能让任何人依赖它。
  • @Clonkex:重要的是函数参数的声明,而不是对象的来源。如果函数需要一个指针,那么你将传递一个指针。如果它需要一个向量,那么你将传递一个向量...

标签: c++ vector struct


【解决方案1】:

正如 Luchian 所说,sizeof(vector&lt;int&gt;) == sizeof(vector&lt;vertexNodeInfo&gt;) 可能但不是必需的。

此外,我认为标准对默认初始化向量的capacity 没有任何要求:

Initial capacity of vector in C++

因此允许容量为 10,这意味着它已经为前面的 10 个元素分配了足够的内存。那么这个分配的大小当然取决于元素的大小。您并没有准确定义“内存大小”是什么意思,但如果您的意思是包含动态分配,那么这就是其中之一。

我不认为这是vector 的一个非常好的实现,但它符合标准。

【讨论】:

    【解决方案2】:

    没有要求。更重要的是,这是一个表述不当的问题。

    向量的.size 将是0,因为它没有元素。

    sizeof 不影响元素的数量,并且通常足够大以包含指向类型的一两个指针(它们本身的大小可能会有所不同,因此无法保证 sizeof(vector&lt;vertexNodeInfo&gt;) 和 @987654326 @ 相等),大小和容量。

    【讨论】:

    • 糟糕,我没想到。我的意思是在记忆方面。显然.size 将是 0 :) 问题已编辑。
    • @Clonkex sizeof 可以变化。您可以强制编译器错误找出答案。
    • 所以sizeof(vector&lt;vertexNodeInfo&gt;) 会比sizeof(vector&lt;int&gt;) 大吗?
    • 刚刚看到你的其他评论。
    • @Clonkex 可以,是的。它也可以更小。但是 99% 的情况都是一样的。见stackoverflow.com/questions/15832631/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    相关资源
    最近更新 更多