簡體   English   中英

什么時候為變量分配內存空間?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM