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

JavaScript如何决定为数值分配的内存大小?,javascript,memory,memory-management,Javascript,Memory,Memory Management,像Java/C这样的编程语言有int、long、byte等,它们精确地表示解释器在运行时应该为一个数字分配多少内存。如果处理大量变量,这将节省大量内存 我想知道没有这个基本变量类型声明(JavaScript、Ruby)的编程语言是如何决定分配多少内存的,比如说var a=1。如果它分配1个字节,那么在下一行中,如果我分配了a=9999999999,它将必须刷出该变量并重新分配。这不是一个昂贵的手术吗 或者他们是否为所有变量分配了非常大的内存空间,以便一个大小适合所有变量 JavaScript值

像Java/C这样的编程语言有int、long、byte等,它们精确地表示解释器在运行时应该为一个数字分配多少内存。如果处理大量变量,这将节省大量内存

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

或者他们是否为所有变量分配了非常大的内存空间,以便
一个大小适合所有变量

JavaScript值

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

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

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

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

atom管理器由唯一关联字符串的哈希表组成 使用扫描程序/解析器信息,如脚本中的关键字类型、索引 原子扮演三个角色:作为文本 被未对齐的16位立即字节码操作数称为唯一 用于高效属性名哈希的字符串描述符,以及作为成员 精确GC的根GC集的

根据学校的说法:

此格式以64位存储数字,其中数字(分数) 存储在位0至51中,指数存储在位52至62中,符号 在第63位:

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


也请阅读这篇文章。

如果你每次达到限额时都将分配加倍,那么你的摊销操作复杂性仍然是O(1)。是的,但是初始值是如何确定的?如果
var a=fxThatReturnNo()
,inter-preter如何决定变量的初始大小?它将等待函数调用解析?在内部,JavaScript将所有数字表示为浮点值。当实际赋值完成时,可以保留内存。“对于数值变量?”-请注意,JavaScript没有数值变量,只有数值。
var a=1
后面的下一行可能是
a='a string'
。很抱歉,它不完全清楚。这表明他们为所有变量分配了双精度,这不是非常低效的内存管理吗?@sapy是的,是的。但它就是这样做的。JavaScript没有
float
int
类型,因此内存管理对于所有数字格式都是通用的。@sapy这是一个相当广泛的概括。实现的效率只有在用例的上下文中才有意义。@sapy它是空间、速度和复杂性之间的权衡。正如您在问题中所指出的,使用可变大小的变量会造成很大的复杂性(而且还会增加大小,因为有人需要跟踪变量现在有多大以及在内存中的位置,这意味着您已经在为指针付费。)