簡體   English   中英

JavaScript(或 NodeJS)如何處理內存分配?

[英]How does JavaScript(or NodeJS) handle memory allocation?

假設 V8 上下文。

假設Number類型的元素大小為 4 個字節。

現在,如果我有一個數組,

let a = [1,2,3,4,5];

按理來說,每個元素的塊起始地址應該是1000,1004,1008,1012,1016

現在,假設我們有一個需要 10 個字節的字符串TestString ,我這樣做:

a[2] = 'TestString';

這樣數組就變成了[1,2,'TestString',4,5]

JS如何處理TestString的內存分配和管理數組中塊的地址空間?

JavaScript 中的數組實際上只是一種特殊類型的對象。 因此,數組的“索引”實際上只是存儲整數值的屬性,存儲的數據只是指向分配的內存塊的指針——非常像鏈表。

這就是為什么您可以在現有數組上使用 push 或 pop 等數組方法,而無需重新分配為數組預留的內存塊。

我不知道 V8 正在做什么的確切細節,但我假設由於 JavaScript 的松散/動態類型性質,它可能不會像您在示例中使用的那樣連續分配內存——有太多的潛力這種弱動態類型語言的缺點。

JavaScript 基本上使一切成為對象。 一個數組就是一個對象,數組的索引值,只是指向對象的指針。 這就是為什么每種數據類型都是變量並且可以訪問屬性和方法的原因。

實際上,地址空間為:

let a = [1, 2, 3, 4, 5];

將是指向分配的內存塊的指針,例如 548995、48885、3889282、093838、7883344。或類似的東西。 當你重新分配它們中的任何一個時,JavaScript 將在堆中找到一塊內存並將數組索引值設置為分配塊的指針。

暫無
暫無

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

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