【发布时间】:2020-01-29 08:55:55
【问题描述】:
在 Dart 网站上,他们说整数大小是 64 位,这是整数的最大大小,还是任何整数的大小,即使整数是 12 这样的小数?
如果每个整数大小都是 64 位,这会影响应用程序的性能吗?
【问题讨论】:
在 Dart 网站上,他们说整数大小是 64 位,这是整数的最大大小,还是任何整数的大小,即使整数是 12 这样的小数?
如果每个整数大小都是 64 位,这会影响应用程序的性能吗?
【问题讨论】:
答案是:“视情况而定”。
首先,如果将 Dart 编译为 JavaScript,所有 Dart 编号(int 和 double 值)都由 JavaScript Numbers 表示。这意味着所有 Dart 编号都是 Dart doubles。即使是整数,它们也只是非小数双精度数,因此最多可以有 53 位的精度。因此,在网络上,int 值也实现了double。
原生(非网络)Dart ints 是 64 位二进制补码整数。如果 VM 可以看到其中的优势,它可能会在内部将其中一些表示为较小的数字,但这是您不应该看到的实现细节。
在 64 位 VM 上,所有指针都是 64 位的,因此您不能直接存储小于 Dart 堆中的任何内容(至少在类型化数据列表之外)。尽管如此,如果你的值是一个 63 位的有符号整数,VM 可以直接将它存储在一个指针中(所谓的“小整数”或“smi”),否则它必须分配一个堆对象来存储 64 位,这样它仍然可以区分整数和堆指针。这对垃圾回收很重要。
在 32 位 VM 上,所有指针都是 32 位的,如果你的整数是 31 位有符号整数,则可以存储在指针中,否则就变成堆对象。
这是用于存储数字,以便您以后可以从其他地方读回它们。对于函数内的局部变量,VM 知道它的所有访问方式,VM 可以选择unbox该值,将普通整数存储在堆栈上,而不是堆数或标记的小整数。如果编译器知道您只使用 16 位整数,它可以(理论上)只使用 16 位。在实践中,任何小于 32 位的东西都可能效率较低。
这些优化是出于性能原因,所以是的,它会影响性能,编译器会尽量避免不必要的开销。
这是当前的实现。只要您在运行程序时无法区分,它就可以随时更改。
【讨论】: