在C++中,是在堆栈或堆上的函数中创建的向量或映射

In C++, is created vector or map in a function on stack or heap?

本文关键字:创建 函数 向量 映射 C++ 堆栈      更新时间:2023-10-16

我有一个非常简单的问题,但我无法通过谷歌找到。

在C++中,如果我们在函数中创建一个整数,我相信它会在堆栈中。但如果我们创建一个矢量或地图,例如

vector<int> a

它会堆起来还是堆起来?我相信这是一种类对象(类似于java中"new"创建的对象),所以它可能应该在堆上?

vector<int>对象本身是在您选择的存储中创建的:如果您将其声明为局部变量,则它将在自动存储中。

然而,向量通常表示为一对指针;在动态存储区域中分配该向量的数据

std::map<K,V>也是如此:当数据进入动态存储区时,对象会放在你放的任何地方(根据你的声明,自动、静态或动态内存)。

从C++11开始,您可以将std::array<T>类用于固定大小的集合。此集合的数据将完全存储在您放置集合本身的存储器中。但是,这样的集合不可调整大小。

任何动态大小的对象的数据都将被堆分配。如果它在堆栈上,那么如果它变得太大,就会有溢出和程序崩溃的风险。

对象本身(即动态数组的大小和指向数据在内存中位置的指针)可能会存储在堆栈上。

是的,这也将在堆栈上创建。

只有在调用new或malloc时,才会在堆上创建变量。

类型其实并不重要,重要的是它是如何创建的。

如果您试图决定是在堆栈上还是动态地(在堆上)创建可变对象,则应该考虑对象的生存期。如果您只是在创建它的范围内需要它,那么就在堆栈上创建它。否则将动态创建它。

这里,向量存储在堆和堆栈上。也就是说,标头在堆栈上,但当您将元素放入向量中时,这些元素会被动态分配,因此在堆上。