JavaScript 如何决定为数值分配多大的内存?

Posted

技术标签:

【中文标题】JavaScript 如何决定为数值分配多大的内存?【英文标题】:How JavaScript decides what size of memory to allocate for a numeric value? 【发布时间】:2017-11-22 10:33:18 【问题描述】:

像 Java / C 这样的编程语言有 int、long、byte 等,它们会建议解释器在运行时准确地为一个数字分配多少内存。如果您要处理大量变量,这可以节省大量内存。

我想知道没有这种原始变量类型声明(javascript、Ruby)的编程语言如何决定分配多少内存,比如说var a = 1。如果它分配了 1 个字节,那么在下一行中,如果我执行 a = 99999999999 ,它将不得不刷出该变量并重新分配。这不是一项昂贵的手术吗?

或者他们是否为所有变量分配了非常大的内存空间,以便one size fit all

【问题讨论】:

如果每次达到限制时都将分配翻倍,那么您的摊销操作复杂度仍将是 O(1)。 是的,但是初始值是如何决定的?如果 var a = fxThatReturnNo() ,解释器如何决定 a 的初始大小?它将等待函数调用解决? 在内部,JavaScript 将所有数字表示为浮点值 Number Data Type in javascript 实际分配完成时可以保留内存。 "对于数字变量?" - 请注意,JavaScript 没有数字变量,只有数字 . var a = 1 之后的下一行可能是 a = 'a string' 【参考方案1】:

Here is a good explanation.

JavaScript 值

JS::Value 类型表示一个 JavaScript 值。

表示是 64 位,并在所有平台上使用 NaN-boxing, 尽管确切的 NaN 装箱格式取决于平台。 NaN-boxing 是一种基于以下事实的技术:在 IEEE-754 中有 2**53-2 个不同的位模式,都代表 NaN。因此,我们可以 将任何浮点值编码为 C++ 双精度(注意 JavaScript NaN 必须表示为一种规范的 NaN 格式)。其他 值被编码为值和类型标记:

在 x86、ARM 和类似的 32 位平台上,我们使用我们所谓的 “nunboxing”,其中非双精度值是 32 位类型标记和 32 位有效负载,通常是指针或带符号的 32 位 整数。有几个特殊值:NullValue(), UndefinedValue()、TrueValue() 和 FalseValue()。在 x64 和类似设备上 64位平台,指针比32位长,所以不能用 nunboxing 格式。相反,我们使用“punboxing”,它有 17 位 标签和 47 位有效载荷。只有 JIT 代码真正依赖于 布局——引擎中的所有其他东西都通过 像 val.isDouble() 这样的函数。 JIT 的大部分部分也避免了 直接取决于布局:文件 PunboxAssembler.h 和 NunboxAssembler.h 用于生成依赖于 值布局。

对象由一个可能共享的结构描述组成,称为 地图或范围;向量中的非共享属性值,称为 插槽。每个属性都有一个 id,可以是非负整数或 atom(唯一字符串),具有与 a 相同的标记指针编码 jsval。

原子管理器由一个哈希表组成,唯一地关联字符串 带有扫描器/解析器信息,例如关键字类型、脚本中的索引 或函数文字池等。原子扮演三个角色:作为文字 由未对齐的 16 位立即字节码操作数称为唯一 字符串描述符,用于高效的属性名称散列,并作为成员 为精确 GC 设置的根 GC。

根据 W3Schools:

这种格式以 64 位存储数字,其中数字(小数) 存储在位 0 到 51 中,指数存储在位 52 到 62 中,符号 第 63 位:

值(又名分数/尾数):52 位 (0 - 51) 指数:11 位 (52 - 62) 符号:1 位 (63)

也可以阅读这篇文章here。

【讨论】:

很抱歉没有完全清楚。它建议他们为所有变量分配 double ,这不是非常低效的内存管理吗? @sapy 是的。但这就是它的工作方式。 JavaScript 没有 floatint 类型,因此内存管理对所有数字格式都是通用的。 @sapy 这是一个相当广泛的概括。实现的效率只对用例的上下文有意义。 @sapy 这是空间、速度和复杂性之间的权衡。正如您在问题中指出的那样,拥有可变大小的变量会产生很大的复杂性(并且还会增加大小,因为有人需要跟踪变量现在有多大以及在内存中的何处找到它,这意味着您已经为指针。)

以上是关于JavaScript 如何决定为数值分配多大的内存?的主要内容,如果未能解决你的问题,请参考以下文章

malloc是如何分配内存的

如何决定为基于规则的系统创建哪些单元测试

memcached 最大能存储多大的单个 item?

memcached 最大能存储多大的单个 item?

memcached 最大能存储多大的单个item?

【50分】动态申请指针数组 ptr = malloc(sizeof(char *) * n);这申请了多大的内存?