簡體   English   中英

未初始化的變量內存分配

[英]Uninitialized variable memory allocation

JavaScript范例

假設我這樣做:

var i;

而且永遠不要在程序的其他任何地方使用我。 會分配任何內存嗎?

或者,如果我使用,請說i=2; 在幾行之后....它會在此時分配內存,還是在創建i期間分配內存?

C#示例

假設我這樣做:

dynamic i;

而且永遠不要在程序的其他任何地方使用我。 是否會為其分配任何內存(如果有的話,什么時候?在編譯期間?)?

或者,如果我使用,請說i = 2; 在幾行之后....它會在此時分配內存,還是在創建i期間分配內存,還是在編譯期間分配內存?

另外,除了由於JavaScript是一種解釋語言而C#是一種編譯語言這一事實​​而引起的差異之外,上述兩個示例中的內存分配是否還有其他差異?

在C#中,表達式為:

var i;

不能首先編譯; 如果我們考慮改為:

int i; // or dynamic i;

那么可以對其進行編譯,也可以不保留,但這取決於它是字段 (對象變量)還是局部 (方法變量)。 字段不會被刪除; 但是,編譯器可以根據需要自由刪除局部變量。 是否選擇這樣做取決於很多事情,但最值得注意的是:您是在進行優化的發布版本還是調試版本。 即使局部變量可以清楚地讀寫,編譯器仍然可以選擇刪除它-當然,該仍將存在於堆棧中,但不在保留位置。

當Javascript解釋器解析var i; 然后執行包含作用域,它必須將事實存儲在當前作用域中現在已定義i變量的位置。 此范圍內的期貨參考將訪問此范圍內的此特定變量。 盡管實現細節留給實現者,但變量i可能會添加到特定的作用域對象中,因此必須消耗一些內存。

如果未引用該變量,並且該變量處於包含范圍內而不使用eval() ,則JS引擎可能會對其進行優化。 它是否真正認為可以做到這一點,以及是否確實可以做到這一點,必須通過測試或研究源代碼來發現。

這樣的單個變量可能只消耗很少的內存。 要使這個問題具有重大意義,您可能必須擁有數千個這樣的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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