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