我一直在閱讀如何在C++中分配內存。C++中的內存組織
一些資源提:
http://www.geeksforgeeks.org/memory-layout-of-c-program/
http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory
Object creation on the stack/heap?
Global memory management in C++ in stack or heap?
http://msdn.microsoft.com/en-us/library/vstudio/dd293645.aspx
Heap/Stack and multiple processes
Do different programs gets their memory from a common heap or from a separate heap?
http://computer.howstuffworks.com/c28.htm
我想根據我的閱讀澄清幾點:
根據http://www.geeksforgeeks.org/memory-layout-of-c-program/第4棧「堆棧,其中自動存儲變量以及每次保存的信息E中的功能被稱爲」
假設:
class myClass{
int a;
char b;
public:
myClass(int a,char b)
{
this->a = a;
this->b = b;
}
};
1)據我已閱讀,當我們編譯這段代碼二進制坐落在程序存儲器和目前尚無分配堆棧。正確?
現在,在我的主要:
int main()
{
myClass Ob(1,'c');
return 0;
}
2)現在的大小5個字節的物體Ob(4字節(int)的,1個字節(字符) - 32位OS)是在堆疊產生的,因爲它是一個自動變量。正確嗎?
3)當構造函數myClass(int a,char b)
被調用時,臨時變量(參數a,b)是在堆棧上爲構造函數創建的,然後在創建對象Ob後被銷燬?就像我們通過按值傳遞參數來調用函數一樣。
現在假設另一類
class pointerClass {
int a;
char* b;
public:
pointerClass(int size){
b= new char[size];
a=size;
}
};
現在,在主:
int main()
{
pointerClass ptr(10) ; //Step 1
}
4)不執行的大小的8個字節這意味着PTR對象(INT一個(4個字節),字符* B(4字節,即只是持有指向堆的地址)在堆棧上創建?還有一個10字節的內存(對應於新的char [10]被分配在堆上),它正在被char * b的內容指向嗎?正確嗎?
5)當我們通過引用(如fn (int *a,char* b)
或fn(int& a,char& b)
)將參數傳遞給某個函數時,這是否意味着在函數棧上爲函數指定實際傳遞的對象並在函數返回時被銷燬時創建臨時指針/引用?或者更確切地說是傳遞實際的對象,而不是創建並銷燬函數棧上的臨時指針/引用?
這是我昨天問,但我不是滿意的答覆: Constructor, Copy Constructor and Stack Creation : C++
6)當我們重載FN如fn(int a,char b)
fn(int& a,char& b)
我們可以從主調用爲fn(A,B)
低於投 static_cast<void(*)(int, char)>(fn)(a, c); //Calls fn(int a,char b)
static_cast<void(*)(int&, char&)>(fn)(a, c);//Calls fn(int& a.char& b)
到底發生了什麼?什麼是無效(*)。
由於
我認爲你需要將這個問題分成幾個小問題。你希望我們寫C++書作爲答案嗎? – 2013-05-07 06:16:44
我認爲所有的問題都是相關的,因此置於一個問題之下。答案是「是」或「否」。大多數情況下,輸入時不需要輸入太多的內容。 – 2013-05-07 06:18:09
@Mat編輯我的問題 – 2013-05-07 06:19:48