繁体   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