当我们在 c++ 中像int x
在函数中一样实例化一个变量时(即 x 是一个局部变量),它被分配在进程的堆栈顶部。但是如果我们这样做int *x= new int
,空间是在堆中提供的。
所以,我的问题是:
不同类的对象(由 c++ 提供的类或用户定义的类)呢?他们的对象在哪里实例化?例如:让 Employee 是一个类,我们声明
Employee emp;
.emp
堆栈或堆中的空间在哪里?如果声明
int a[4]
在函数内,是否所有四个单元格都a
在堆栈上获得空间?
当我们在 c++ 中像int x
在函数中一样实例化一个变量时(即 x 是一个局部变量),它被分配在进程的堆栈顶部。但是如果我们这样做int *x= new int
,空间是在堆中提供的。
所以,我的问题是:
不同类的对象(由 c++ 提供的类或用户定义的类)呢?他们的对象在哪里实例化?例如:让 Employee 是一个类,我们声明Employee emp;
. emp
堆栈或堆中的空间在哪里?
如果声明int a[4]
在函数内,是否所有四个单元格都a
在堆栈上获得空间?
所有局部变量,无论是来自类的内置类型还是数组,都在堆栈上。所有动态分配都在堆上。
当然,像static
局部变量这样的修饰符会使变量被放在其他地方,所以它在函数调用之间被保留。
此外,为了进一步混淆您,当您创建一个局部指针变量并使其指向动态分配的对象时,例如
Class* a = new Class;
实际变量a
在堆栈上,但它指向的内存在堆上。
附录:C++ 规范实际上并没有提到任何关于堆栈或堆的内容,只提到了不同类型变量的行为。
它与普通类型完全相同。
Class a; //stack. Usage: a.somethingInsideOfTheObject
Class *a = new Class(); //heap. Usage: a->somethingInsideOfTheObject
请注意,如果类本身在堆上分配某些东西,则该部分将始终在堆上,例如:
class MyClass
{
public:
MyClass()
{
a = new int();
}
private:
int * a;
};
void foo()
{
MyClass bar;
}
在这种情况下,bar
变量将在堆栈上分配,但a
它的内部将在堆上分配。
这取决于。如果Employee
有成员,仅在堆栈上分配,那么整个对象就是。但是,Employee
可能有指针成员,并且Employee
的构造函数可以在堆上为它们分配内存。然后一些成员在堆上,一些在堆栈上。
是的。
用户定义的类(和类型)与内置类型没有什么不同。所以
Employee emp; // allocated in stack
Employee* emp = new Employee(); // allocated in heap
至于你的第二个问题,本地数组是在堆栈上分配的
Employee emp[4]; // 4 instances on stack
通常,如果编译器在编译时知道它(即局部变量),它就在堆栈上。
如果编译器在编译时不知道它(即通过 等动态分配new
)malloc
,它就在堆上。