繁体   English   中英

条件评估是否优化? 这段代码不好吗?

[英]Is condition evaluation optimized ? Is this code bad?

1.Imagine条件if (obj.is_x() || obj.is_y() || obj.is_z())
如果obj.is_x()返回true,是否会调用obj.is_y()obj.is_z()

这个坏主意(一般来说)? 这段代码看起来不好吗?

bool isbn13_prefix_valid (const string& prefix)
{
    unsigned num = stoi(prefix);
    if (num == 978 || num == 979) return 1;  //super common ones
        else if (   num >= 0 && num <= 5 || num == 7 || num >= 600 && num <= 649
                || num >= 80 && num <= 94 || num >= 950 && num <= 989
                || num >= 9900 && num <= 9989 || num >= 99900 && num <= 99999)
            return 1;
    return 0;
}
  1. 不,由于短路 ,它不会。

  2. 是的,那段代码看起来很糟糕。 不是因为它不正确,而是因为你在一个if语句中填充了一个非常长的条件。 尝试重构代码以使其更清晰。

你的代码绝对没问题。 我想看看这些奇怪的数字来自哪里,这就是全部。

如所建议的那样,把它变成十几个琐碎的函数绝不是有帮助的。 它实际上使得阅读代码变得更加困难,因为它会分散在许多代码行中。 是的,这很复杂。 但这是由于问题很复杂,并试图将复杂性扩散出来并没有帮助。

你的实际问题:在||中 b,首先评估a。 如果为真,则不评估b,结果为真。 如果a为假,则还会对b进行求值,结果为真或假,具体取决于b的结果。

优化编译器可以在完成评估a之前开始评估b,如果它可以证明b的评估没有副作用,并且如果它认为(主要是由于硬件中的并行性)它平均更快地评估为尽可能并行,即使有些事情在没有必要时进行评估。 但是这在代码的结果中并不明显,只会使代码更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM