gpt4 book ai didi

javascript - JavaScript(或 NodeJS)如何处理内存分配?

转载 作者:行者123 更新时间:2023-11-30 19:04:50 26 4
gpt4 key购买 nike

假设 V8 上下文。

假设 Number 类型的元素大小为 4 个字节。

现在,如果我有一个数组,

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

从逻辑上讲,每个元素的 block 起始地址应该是1000,1004,1008,1012,1016

现在,假设我们有一个需要 10 个字节的字符串 TestString,我这样做:

a[2] = 'TestString';

这样数组就变成了[1,2,'TestString',4,5]

JS如何处理TestString的内存分配和管理数组中 block 的地址空间?

最佳答案

JavaScript 中的数组实际上只是一种特殊类型的对象。因此,数组的“索引”实际上只是存储整数值的属性,存储的数据只是指向分配的内存块的指针——非常像链表。

这就是为什么您可以在现有数组上使用 push 或 pop 等数组方法,而无需重新分配为数组预留的内存块。

我不知道 V8 正在做什么的确切细节,但我假设由于 JavaScript 的松散/动态类型性质,它可能不会像您在示例中使用的那样连续分配内存——只有对于这样一种弱动态类型的语言来说,它有太多潜在的缺点。

JavaScript 基本上使一切 成为对象。一个数组就是一个对象,数组的索引值,只是指向对象的指针。这就是为什么每种数据类型都是变量并且可以访问属性和方法的原因。

实际上,地址空间是:

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

将是指向分配的内存块的指针,例如 548995、48885、3889282、093838、7883344。或类似的东西。当您重新分配它们中的任何一个时,JavaScript 将在堆中找到一 block 内存并将数组索引值设置为分配 block 的指针。

关于javascript - JavaScript(或 NodeJS)如何处理内存分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59099863/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com