在Dart站点中,他们说整数大小是64位,这是整数的最大大小,还是任何整数的大小,即使整数是一个小数字,比如12?
如果每个整数大小为64位,这会影响应用程序的性能吗?
发布于 2019-09-30 12:23:49
答案是:“视情况而定”。
首先,如果将Dart编译成JavaScript,那么所有的Dart数(int
和double
值)都由JavaScript Number
__s表示。这意味着所有的Dart数都是Dart double
s。即使是整数,它们也恰好是非小数倍,因此最多可以有53位精度。因此,在web上,int
值也实现了double
。
本地(非web) Dart int
s是64位的二次补整数.如果VM可以在内部看到优势,那么它可能在内部将其中的一些表示为较小的数字,但这是您不应该看到的实现细节。
在64位VM上,所有指针都是64位,因此不能直接存储任何小于Dart堆中的指针(至少在类型化数据列表之外)。不过,如果您的值是63位有符号整数,VM可以直接将其存储在指针(所谓的“小整数”或"smi")中,否则它必须分配堆对象来存储64位,这样它仍然可以区分整数和堆指针。这对垃圾收集很重要。
在32位VM上,所有指针都是32位,如果您的整数是31位有符号整数,则可以将其存储在指针中,否则它将成为堆对象。
这是为了存储数字,您可以稍后从其他地方读取它们。对于函数中的局部变量( VM知道其访问的所有方式),VM可以选择解压缩值,将普通整数存储在堆栈上,而不是堆号或标记的小整数。如果编译器知道您只使用16位整数,它(理论上)只能使用16位。实际上,小于32位的任何东西都可能效率较低。
这些优化是出于性能原因,所以是的,它影响性能,编译器试图避免不必要的开销。
这就是当前的实现。它可以在任何时候改变,只要你在运行你的程序时分辨不出区别。
https://stackoverflow.com/questions/58161519
复制相似问题