[英]When is memory space allocated to a variable?
聲明變量時編譯器是否分配了 4 個字節的內存:
int a;
或者當一個值被分配給它時它是否分配內存:
a = 5;
什么時候分配內存? 在變量聲明或初始化期間?
在分配包含它的結構時分配變量。
對於方法中的局部變量,這是在調用方法時(有一些注意事項)。
對於靜態變量,這是“初始化”類的時間(發生在它加載后和第一次使用之前的一段時間)。
對於實例變量,這是創建實例的時間。
在大多數編程語言中,編譯器可以選擇何時為變量分配空間。 您唯一可以保證的是,存儲將在您需要時可用。
一個簡短的軼事...
過去的 C 編程語言要求在方法的頂部聲明方法中使用的所有變量。 這是因為編譯器曾經在您進入方法后立即為方法中的所有堆棧(局部)變量保留存儲空間。 今天這個要求不存在的部分原因是編譯器要聰明得多。
大多數類 C 語言的編譯器會推遲實例的分配,直到第一次用於優化代碼。 這里真正棘手的是,第一次使用可能不在您認為的位置,而且可能根本不會發生。 例如,如果您有以下代碼:
int foo(int x) {
int y = 5;
if (x > 5)
y += x;
return y;
}
您可能認為第一次使用是當您將 5 分配給 y 時,但編譯器可以將該代碼優化為更類似的內容:
int foo(int x) {
if (x > 5)
return 5 + x;
return 5;
}
在這段代碼中,y 根本不存在。
TL;DR - 編譯器實際上並不能保證在聲明或使用時分配內存。 相信編譯器,它(通常)比我們所有人都聰明。
當我們“聲明”一個變量時,意味着我們已經告訴編譯器有關該變量的信息; 即它的類型和名稱,以及為變量(本地或全局)分配的內存單元。 編譯器的后一個動作,存儲分配,更恰當地稱為變量的定義。
簡單定義= 變量聲明 + 變量初始化
JVM 將內存分為棧內存和堆內存。 每當我們聲明新變量和對象、調用新方法、聲明字符串或執行類似操作時,JVM 都會從堆棧內存或堆空間為這些操作指定內存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.