C++ 堆或堆栈分配

c++ heap or stack allocation?

本文关键字:分配 堆栈 C++      更新时间:2023-10-16

这是堆栈上的分配:

char inStack[10]; 
// and 
MyStruct cl;

这应该在堆中分配:

char* inHeap = new char[10];
// and
MyClass cl = new MyClass();

如果MyClass包含char test[10]变量怎么办?这样做:

MyClass cl = new MyClass()

。意味着 MyClass::test 的 10 字节长内容是在堆中而不是堆栈中分配的?

它将在对象内部分配,因此如果对象在堆上,数组将在堆上; 如果对象在堆栈上,数组将在堆栈上; 如果对象位于可执行文件的静态内存中,则数组也将在那里。

在C++中,对象的成员是对象本身的一部分。如果你有对象的地址和它的大小,你就知道类的所有成员都将在[address, address + size)范围内的某个地方,无论该地址实际在内存中的哪个位置(堆、堆栈等)。

如果MyClass有一个char test[10]成员,它将以与分配MyClass实例相同的方式分配。

MyClass mc; //mc.test is on the stack
MyClass * mcp = new MyClass; //mcp->test is on the heap

语言中的专有术语是自动动态存储,这些术语比堆栈更有意义。特别是自动存储并不意味着一般的堆栈,只意味着函数中的局部变量,但正如你提到的,如果你定义一个类的成员,自动存储将是封闭对象所在的任何地方,可以是堆栈、堆或静态对象。