C++ 堆或堆栈分配
c++ heap or stack allocation?
这是堆栈上的分配:
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
语言中的专有术语是自动和动态存储,这些术语比堆栈和堆更有意义。特别是自动存储并不意味着一般的堆栈,只意味着函数中的局部变量,但正如你提到的,如果你定义一个类的成员,自动存储将是封闭对象所在的任何地方,可以是堆栈、堆或静态对象。
相关文章:
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 从堆栈分配的原始指针构造智能指针
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 巨大的内存分配:堆栈与堆
- 有效地分配堆栈对象(由函数的值返回)到堆?
- 为什么不能在 Visual C++ 中动态分配堆栈内存?但海湾合作委员会可以做到
- 为什么分配堆内存比分配堆栈记忆更快
- 安全分配堆栈分配的阵列
- 附加到具有非动态分配堆栈的向量
- 是否随作用域分配和解除分配堆栈帧
- 在执行中脱离堆栈对象的范围之前,请分配堆栈对象
- 全局阵列分配 -- 堆栈或堆
- 如何使新操作员超载以分配堆栈
- 具有类作用域的动态分配堆栈内存
- 如何在 Linux 下为可执行文件分配堆栈
- 内存分配堆栈
- 成员函数内存分配堆栈或堆
- 在 c++ 中重新分配堆栈上的对象
- 防止为类和派生类分配堆栈
- 如何防止msvc++为switch语句过度分配堆栈空间?