2016-07-09 135 views
0

在c#堆棧/堆中的內存分配何時發生。在運行時還是編譯期間?從我的研究中,我明白所有的內存分配都是在運行時間內爲值類型和引用類型發生的。它是否正確?堆棧/堆中的c#內存分配發生

+1

是,內存分配不能在編譯時有發生。只有當程序運行時,該程序所需的所有對象('struct'或'class')纔會被加載到內存中。 – EvilTak

+1

這是正確的...... – zerkms

+1

有人可能會爭辯說,堆棧上的分配發生在編譯時。然後,再次,實際更改堆棧指針的指令必須在運行時執行。這是一個愚蠢的問題。也許你應該閱讀[堆棧和堆是什麼](http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap)。 –

回答

1

在編譯期間會發生什麼?程序尚未運行,程序運行前無需分配內存。這是常見的情況,應該在運行時發生(當實際執行生成的IL時)。

內存管理,也優化,當你只需要創建一個變量,可能不會發生,但是當你第一次使用它。

0

我想你可能會混淆的實際配置,它可以在程序實際運行,與分配計算/確定在運行時纔會發生。例如,考慮以下的方法:

void Foo() 
{ 
    int i = 42; 
    Console.WriteLine(i); 
} 

編譯器將現在靜態(編譯時間)i將需要4個字節的堆疊上的空間。但是,直到程序實際運行時纔會發生實際分配。此外,直到CLR加載代碼並將其傳遞給JIT(即時編譯器),上述方法甚至不會被編譯爲機器代碼(任何操作(如分配)的先決條件)。當然,即使它沒有,它不是直到創建實際的過程中,該OS分配,甚至爲它使用的內存地址空間...