gpt4 book ai didi

Dart int 和 double 被拘留?被相同()特殊对待?

转载 作者:行者123 更新时间:2023-12-02 04:22:52 25 4
gpt4 key购买 nike

Dart 两者都有:

  • 相等运算符==
  • 名为identical()的顶级函数。

通过语法的选择,想要更频繁地使用 Dart 的 == 运算符而不是 identical() 感觉很自然,我喜欢这一点。事实上,Section on Equality Idiomatic Dart的指出“实际上,您很少需要使用”identical()

在最近对 one of my questions concerning custom filters 的回答中,在尝试确定模型的更改是否已达到稳定状态时,Angular Dart 似乎更倾向于使用 identical() 而不是 ==状态。 (我认为,出于效率原因,这对于大型模型来说是有意义的。)

这让我开始思考 int 的身份,因此我在 int 上编写了一些 identical() 测试。虽然我预计小 int 可能“被保留/缓存”(例如,类似于 Java's Integer.valueOf() 所做的事情),但令我惊讶的是,我可以似乎没有生成两个相等但不相同的ints。对于double,我得到了类似的结果。

intdouble 值是否被保留/缓存?或者也许 identical() 正在特殊对待它们?来自 Java 背景的我曾经将 Dart 等同于:

  • == 到 Java 的 equal() 方法和
  • identical() 与 Java 的相等性测试 ==

但现在看来这是错误的。有谁知道这是怎么回事吗?

最佳答案

数字经过特殊处理。如果它们的位模式相同,则它们必须相同(尽管这是否包括不同版本的 NaN 仍有争议)。

主要原因是期望、内部细节泄露和效率。

期望:用户期望数字相同。 x == y(对于两个整数)但不相同(x,y),这违背了常识。

内部细节泄露:VM使用SMI(SMall Integers)来表示特定范围内的整数(32位机器上为31位,64位机器上为63位)。这些都是规范化的并且总是相同的。公开此内部实现细节会导致结果不一致,具体取决于您运行的平台。

效率:虚拟机希望尽可能地对数字进行拆箱。例如,在方法内部, double 经常被移入寄存器。然而,跟踪原始盒子可能既麻烦又困难。

foo(x, y) {
var result = x;
while(y-- > 0) {
result += x;
}
return result;
}

假设虚拟机优化了该函数并将结果移至寄存器中(在此过程中拆箱x)。这允许一个紧密的循环,然后有效地修改结果。当 y 为 0 时,会出现困难的情况。循环不会执行,foo 将直接返回 x。换句话说,以下条件必须为真:

var x = 5.0;
identical(x, foo(x, 0)); // should be true.

如果虚拟机在 foo 方法中取消装箱 result 变量,则需要为 result 分配一个新的装箱>相同的调用因此将返回false

通过修改identical的定义,所有这些问题都可以避免。不过,相同检查的成本很小。

关于Dart int 和 double 被拘留?被相同()特殊对待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21390974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com