C++,为什么数组比向量更快并且使用更少的内存

LGD*_*ODV -2 c++ memory runtime std

在一道leetcode题中。当我用来std::vector存放东西的时候。 i_max、 和j_max是整数。

vector<int> left_vec(i_max);
vector<int> right_vec(j_max);
Run Code Online (Sandbox Code Playgroud)

运行时间:100ms,内存使用:71.5MB。

当我用来std::array存放东西的时候。

int left_vec[i_max];
int right_vec[j_max];
Run Code Online (Sandbox Code Playgroud)

运行时间:40ms,内存使用:16.1MB。

代码的其他部分完全相同,唯一的区别是使用向量或数组。

我很困惑为什么会这样。

Vin*_*uza 5

数组是在堆栈上分配的简单数据序列。

向量是可能在堆上分配的对象。(我不确定所有情况下的情况,我认为这可能取决于 C++ std 库实现和编译器优化,具体取决于您对向量所做的事情。这里和这里有两篇文章根据经验,认为它是在堆上分配的)。

尽管“技术上不完全准确”并且与我刚才所说的堆栈和堆无关,但您应该拥有一种良好的直觉。

数组非常简单,你给它一个类型和一个大小,这就是你所拥有的一切。您的工作是担心不访问数组边界之外的值,如何以及在何处保存或访问数组中的值,跟踪数组的大小......

另一方面,向量是具有许多功能的完整对象。它为您提供了许多方法来帮助您插入、弹出、读取、检查其大小……这是有代价的。

  • *“数组是在堆栈上分配的简单数据序列。”* - 这是一个非常常见的误解。重要的反对意见是,只有当数组(或包含数组的某种类型)是函数参数或本地(自动)变量时,这才是正确的。它也可以是静态的(命名空间范围),或在堆上(无论是独立分配还是因为它是在那里创建的类型的成员)。更严格地说,如果在向量和数组之间切换,对象本身将位于同一位置(堆、堆栈、静态),但“向量”存储的“值”将始终位于堆上。 (2认同)
  • 另外,向量存储一个指向堆的指针,以及一些指示其当前运行时大小和容量的数据(通常是一个指向存储数据末尾的指针,以及一个指向堆存储末尾的指针,共 3 个指针),而“数组”仅存储元素,由用户决定是否想要/需要跟踪正在使用的元素。 (2认同)