memory allocation for objects
当我们在函数中实例化一个变量,如EDCOX1,0,(x是一个局部变量)时,它被分配在进程的栈顶上。但是,如果我们执行
所以,我的问题是:
不同类的对象(C++提供的类还是用户定义的)呢?他们的对象在哪里被实例化?例如:让Employee是一个类,我们声明
如果声明
所有局部变量,无论是来自类的内置类型,还是它们是数组,都在堆栈上。所有动态分配都在堆中。
当然,像
另外,为了进一步混淆,当您创建一个本地指针变量,并使它指向一个动态分配的对象时,例如。
1 | Class* a = new Class; |
实际变量
附录:C++规范实际上没有提到堆栈或堆的任何东西,只是不同类型变量的行为。
它和普通类型完全一样。
1 2 | Class a; //stack. Usage: a.somethingInsideOfTheObject Class *a = new Class(); //heap. Usage: a->somethingInsideOfTheObject |
请注意,如果类本身正在堆上分配某些内容,则该部分将始终位于堆上,例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class MyClass { public: MyClass() { a = new int(); } private: int * a; }; void foo() { MyClass bar; } |
在这种情况下,将在堆栈上分配
这要看情况而定。如果
对。
用户定义的类(和类型)与内置类型没有区别。所以
1 2 | Employee emp; // allocated in stack Employee* emp = new Employee(); // allocated in heap |
至于第二个问题,本地数组是在堆栈上分配的
1 | Employee emp[4]; // 4 instances on stack |
通常,如果编译器在编译时知道它(即局部变量),那么它就在堆栈中。如果编译器在编译时不知道它(即通过
本文有一个详细的解释:global-memory-management-in-c-in-stack-or-heap