1

对不起,解释性不好的标题,我(还)找不到更好的标题。

我习惯于编写布尔表达式,添加一些临时变量来改善表达式的阅读,换句话说,我不喜欢这样:

// Example 1
// hard to read and understand at first glance
if (value % 2 && value ^ weirdFlags &&
    (value > threshold) && (value < ceiling) &&
    /* lots of comparisions */)
{ /* do something*/ }

并且更喜欢这个:

// Example 2
// this is way easier to read and understand
const bool isEven = value % 2;
const bool flagsChecked = value ^ weirdFlags;
const bool inRange = (value > threshold) && (value < ceiling);
const bool foo = /* lots of comparisions */;
if (isEven && flagsChecked && inRange && foo)
{ /* do something*/ }

但是使用我最喜欢的编码风格,我没有利用惰性逻辑优化,因为所有的临时值都是计算出来的,而使用另一种编码风格,只计算出不可思议的值。

还有另一种解决方案,它允许使用惰性逻辑优化并保持代码可读,即注释代码:

// Example 3
// this check test if the value is an even number
// and checks the value with the provided flags
// and assures that the value is in the required range
// and lots of additional comparisions
if (value % 2 && value ^ weirdFlags &&
    (value > threshold) && (value < ceiling) &&
    /* lots of comparisions */)
{ /* do something*/ }

但是,在代码开发过程中,没有保证代码注释与下面的代码匹配,而程序员团队每天都在编写相同的源文件(并不是所有的程序员都关心好的文档)。这就是为什么我更喜欢代码以简洁的方式解释自己。

因此,最后,研究将临时值声明为 的示例 2 案例,const仅在布尔表达式中使用它们,在表达式的相同范围内并接近表达式本身,问题是:

  • 在示例 2 中,编译器是否会执行某种涉及临时值的优化以提高布尔表达式的性能(惰性求值)?
  • 在您自己看来,这三个例子中哪一个最正确?为什么?

感谢您的建议。

4

2 回答 2

1

看一下这个:

if(const bool isEven = value % 2)
if(const bool flagsChecked = value ^ weirdFlags)
if(const bool inRange = (value > threshold) && (value < ceiling))
if(const bool foo = /* lots of comparisions */)
{
    /* do something*/
}

魔法!

于 2013-05-14T07:41:16.350 回答
0

我总是更喜欢可读性而不是过早的优化,直到它被证明是性能瓶颈。

因此,在本例中,示例 2。您可以对此做的其他事情是:

bool Class::isSomething() {
  const bool isEven = value % 2;
  if(!isEven) return false;

  const bool flagsChecked = value ^ weirdFlags;
  if(!flagsChecked) return false;

  const bool inRange = (value > threshold) && (value < ceiling);
  if(!inRange) return false;

  const bool foo = /* lots of comparisions */;
  if(!foo) return false;

  return true;
}
于 2013-05-14T07:42:28.523 回答