V8如何在内存中存储整数?
例如,整数5如何存储?
我知道它将其存储在堆中,但它具体是如何存储的呢? 这些元数据以及实际值本身,是否会在存储之前添加常量?
V8如何在内存中存储整数?
例如,整数5如何存储?
我知道它将其存储在堆中,但它具体是如何存储的呢? 这些元数据以及实际值本身,是否会在存储之前添加常量?
V8使用指针标记方案来区分小整数和堆对象指针。数字5将被存储为Smi
类型,在V8中不需要在堆上进行分配。
您可以查看源代码了解更多关于Smi类的信息。
在32位平台上,Smis是一个带有底部位设置为0的31位有符号整数。 在64位平台上,Smis是一个带有31位0填充和底部位设置为0的32位有符号整数。 指向堆对象的指针底部位设置为1,以便V8可以在没有额外元数据的情况下区分指针和Smis。
double
。没有明确的“整数”类型。x
,它是5.25
,它必须知道它是一个“数字”,并且该数字是5.25。因此,它将占用超过8个字节的空间。您将需要查找v8的源代码以了解更多信息。
m/2
是2.5
,因为所有的值都是浮点数,所以这并不奇怪。另一个值为0,是因为语言规范中定义了<<
截断为int32的2进制补码形式,而不是引擎的表示选择(对于i=30,n变成2^31,对于i=31,1<<i
变成-2^31,所以总和恰好为0)。 - Andreas Rossberg