只有一種類型的內存......它是一個內存:D 不同之處在於它在哪裏以及如何訪問它。
如果你深入瞭解Windows中的exe加載器(或者實際上任何類型的操作系統),它真正做的是存儲你的部分的信息(部分你的exe),並且在運行時放置它正確進入內存並應用訪問權限。所以一般來說,你的「程序」與你的數據部分是相同的內存(你的RAM)的代碼部分。不同之處在於訪問權限不同,代碼段通常只讀+執行數據,只讀+寫(而不執行)。
堆棧仍然是一個內存,它的意義在於它再次由操作系統控制,堆棧大小是堆棧大小的大小(以字節爲單位),但這裏的目的是保存即時值在函數調用之間(根據stdcall)和局部變量(取決於編譯器它是如何完成的),因爲它是一個你可以使用的內存,但是和你一樣,可以讓它在堆棧上分配一個10000字節的字符串。在彙編中你可以直接訪問,因爲有一個堆棧指針EBP(如果我沒記錯的話),或者在C/C++中,你可以使用alloca。
新的和刪除操作符爲C++語言內置,但據我所知他們使用相同的系統分配器,事實上,你可以覆蓋它們並使用malloc/free,它應該工作,這意味着這也是同樣的記憶。
使用new/delete和os特定函數的區別在於你讓語言處理分配,但最終你會得到一個指針,就像使用其他函數一樣。
除此之外,還有一些特殊的方法,但是這些改變了內存處理的方式,在Windows中這是虛擬內存,比如VirutalAlloc,VirutalFree將允許你指定你想要使用的內存因此你可以讓操作系統更好地優化,就像你告訴它我想2Gb的內存一樣,但它不一定要在RAM中,所以它可以將它保存在磁盤上,但你仍然可以通過內存指針訪問它。
而關於你的問題:
static const int MAX_SIZE = 256; //I assume this is static Data
這通常取決於編譯器,但他們大多將其視爲常量(靜態別的東西),這意味着,這將是在exe文件的常量部分,其這意味着這個內存塊將是隻讀的。
int* myArray = new int[30]; //I assume this is allocated on heap memory
是的,這將是在堆上,但它是如何分配依賴於實現,只要你重寫新的運營商,如果你這樣做,你可以例如迫使它在虛擬內存中,因此實際上它可能在磁盤或內存中,但這樣做是愚蠢的事情,是的,它會在堆上。
bool res = initialiseArray(myArray, 30); //Where does this lie?
多的事情在這裏發生,因爲編譯器知道initialiseArray的第一個參數必須是一個指向一個int它會通過一個指針MYARRAY所以無論指針和30的值會在堆棧上然後調用該函數。 在它運行的內存(代碼段)中的函數中,從堆棧中獲取參數(int * arrayParam,int sizeParam),它會知道要寫入arrayParam,並且它是指針,所以它會寫入arrayParam指向的位置。到你指定它與arrayParam [i] <我會將內存指針偏移到正確的值,再次C++通過調整指針爲你做一些魔術,因爲代碼中的調整應該以字節爲單位,它會移動內存指針4因爲(通常)int == 4個字節。使用調試器或反彙編器(如OllyDbg)並親自查看它,如果您想了解更多關於如何使用堆棧的信息,請查看stdcall調用慣例。
感謝您的詳細回覆Tristan,讓事情變得更加清晰:) – user2757842