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

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

我想知道没有这个原始变量类型声明(JavaScript,Ruby)的编程语言如何决定分配多少内存让var a = 1 。 如果它分配让我们说1个字节,然后在下一行,如果我做a = 99999999999 ,它将不得不滑出该变量并重新分配。 这不是一个昂贵的操作吗?

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


这是一个很好的解释。

JavaScript值

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

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

在x86,ARM和类似的32位平台上,我们使用我们所说的“nunboxing”,其中非double值是32位类型标记和32位有效内容,通常是指针或签名32位整数。 有几个特殊值:NullValue(),UndefinedValue(),TrueValue()和FalseValue()。 在x64和类似的64位平台上,指针长度超过32位,所以我们不能使用nunboxing格式。 相反,我们使用“punboxing”,它具有17位标签和47位有效载荷。 只有JIT代码实际上依赖于布局 - 引擎中的其他所有内容都通过val.isDouble()等函数与值交互。 JIT的大多数部分还避免直接依赖布局:文件PunboxAssembler.h和NunboxAssembler.h用于生成取决于值布局的本机代码。

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

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

根据W3Schools的说法:

该格式将数字存储在64位中,其中数字(分数)存储在位0到51中,指数位52到62中,并且符号位63中:

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

在这里阅读这篇文章。

链接地址: http://www.djcxy.com/p/14081.html

上一篇: How JavaScript decides what size of memory to allocate for a numeric value?

下一篇: Class members memory allocation