在C++的上下文中(并不重要):
class Foo{ private: int x[100]; public: Foo(); }
我学到的东西告诉我,如果你像这样创建一个Foo实例:
Foo bar = new Foo();
然后在堆上分配数组x,但是如果你像这样创建了一个Foo实例:
Foo bar;
然后它在堆栈上创建.
我无法在线查找资源以确认这一点.
鉴于您的示例略有修改:
class Foo{ private: int x[100]; int *y; public: Foo() { y = new int[100]; } ~Foo() { delete[] y; } }
例1:
Foo *bar = new Foo();
x和y在堆上:
sizeof(Foo*)在堆栈上创建.
sizeof(int)*100*2 + sizeof(int*)在堆上
例2:
Foo bar;
x在堆栈上,y在堆上
sizeof(int)*100位于堆栈(x)+ sizeof(int*)
sizeof(int)*100在堆上(y)
由于类/结构对齐,实际大小可能略有不同,具体取决于您的编译器和平台.
严格地说,根据标准,对象不需要存在于堆栈或堆上.该标准定义了3种类型的"存储持续时间",但没有说明存储必须如何实现:
静态存储时间
自动存储时间
动态存储持续时间
使用堆栈通常(几乎总是)实现自动存储持续时间.
动态存储持续时间通常使用堆(最终通过malloc()
)来实现,但即使编译器的用户也可以覆盖它.
静态存储持续时间通常称为全局(或静态存储).
关于这些事情的标准是这样说的(以下是3.7的各种部分的摘录 - 存储持续时间):
静态和自动存储持续时间与声明(3.1)引入的对象相关联,并由实现(12.2)隐式创建.动态存储持续时间与使用operator new创建的对象相关联(5.3.4).
...
既没有动态存储持续时间也没有本地的所有对象都有静态存储持续时间.这些对象的存储应持续到程序的持续时间(3.6.2,3.6.3).
...
显式声明为auto或者注册或未显式声明为static或extern的本地对象具有自动存储持续时间.这些对象的存储将持续到创建它们的块为止.
...
可以在程序执行期间动态创建对象(1.9),使用new-expressions(5.3.4),使用delete-expressions(5.3.5)销毁对象.AC + +实现通过全局分配函数operator new和operator new []以及全局释放函数operator delete和operator delete []提供对动态存储的访问和管理.
...
该库提供全局分配和释放功能的默认定义.一些全局分配和释放功能是可替换的(18.4.1)
最后(关于示例类中的数组):
3.7.4子对象的持续时间[basic.stc.inherit]
成员子对象,基类子对象和数组元素的存储持续时间是其完整对象的存储持续时间(1.8).
Foo类型的对象按顺序存储100个整数的大小.如果你在堆栈上创建它,你将在堆栈中获得它.如果你用new做,它将作为对象的一部分在堆上.
这是语言规范的一部分,我不确定你的问题是什么.