當我們在一個函數內(例如,x是一個局部變量)在C++中實例化一個像int x
這樣的變量時,它被分配在進程的堆棧之上。但是如果我們做int *x= new int
,空間是堆中提供的。對象的內存分配
所以,我的問題是:不同類別的
什麼對象(用C++或用戶提供的類定義的)?他們的對象在哪裏實例化?例如:讓員工是一個班級,我們宣佈
Employee emp;
。emp
給出空間 - >堆棧或堆?如果聲明
int a[4]
在一個函數內,那麼a
的所有四個單元格是否會在堆棧上獲得空間?
當我們在一個函數內(例如,x是一個局部變量)在C++中實例化一個像int x
這樣的變量時,它被分配在進程的堆棧之上。但是如果我們做int *x= new int
,空間是堆中提供的。對象的內存分配
所以,我的問題是:不同類別的
什麼對象(用C++或用戶提供的類定義的)?他們的對象在哪裏實例化?例如:讓員工是一個班級,我們宣佈Employee emp;
。 emp
給出空間 - >堆棧或堆?
如果聲明int a[4]
在一個函數內,那麼a
的所有四個單元格是否會在堆棧上獲得空間?
這取決於。如果Employee
具有僅在堆棧上分配的成員,則整個對象爲。但是,Employee
可能有指針成員,並且Employee
的構造函數可能會在堆上爲它們分配內存。然後一些成員在堆上,一些在堆上。
是的。
它與正常類型完全一樣。
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
將分配在堆上。
值得注意的是,如果'Class'在內部使用'new',即使'a'本身駐留在堆棧上,它總是使用堆。 – NPE
@NPE,是的,但只要你把它們當作黑盒子,你幾乎不會知道它 – SingerOfTheFall
@SingerOfTheFall - 真的,它仍然是一個重要的細節。 –
所有局部變量,無論來自類的內置類型,還是它們是數組,都在堆棧中。所有動態分配都在堆上。
當然,像局部變量static
這樣的修飾符會將變量放在其他位置,所以它在函數調用之間保留。另外,當你創建一個局部指針變量並使其指向一個動態分配的對象時(例如,
Class* a = new Class;
實際變量a
是在堆棧上,但它指向的存儲器是在堆上。
附錄:C++規範實際上沒有提到任何有關堆棧或堆的內容,只是不同類型變量的行爲。
用戶定義的類(和類型)與內置類型沒有區別。 所以
Employee emp; // allocated in stack
Employee* emp = new Employee(); // allocated in heap
關於你的第二個問題,本地陣列上的堆棧中分配
Employee emp[4]; // 4 instances on stack
一般情況下,如果編譯器在編譯時(即局部變量)知道它,它的堆棧。
如果編譯器在編譯時不知道它(即通過new
,malloc
等動態分配),它就在堆上。
我想提一提的是'new',如果不超載,在所謂的自由存儲,這不一定是堆分配空間,雖然在實踐它。如果**被**超載,'new'可以做任何事情。 – Alex