3

假设您的第一个目标是执行速度,然后是代码清洁度,最后是资源使用率。

如果在算法的某个点,一个变量(例如一个双精度数)不再改变(但你仍然要读很多次),你会把它复制成一个常量值吗?

4

3 回答 3

3

如果你想让你的代码更清晰,无论如何,将你的值复制到 aconst double const_value = calculated_value;中,但是编译器非常擅长跟踪依赖关系,并且极不可能(假设你使用的是现代、合理的编译器)代码将是任何更快或以其他方式“更好”,因为您这样做。编译器很有可能会因为您需要第二个变量这一事实而接受您的话,从而制作副本,并因此使代码变慢。

与往常一样,如果性能对您的应用程序很重要,请为您的特定代码制作“之前和之后”的比较基准,因为在 Internet 上阅读页面或在 SO 上询问与对代码进行基准测试不同。

于 2013-04-29T13:19:57.760 回答
3

只是将非常量变量复制到一个常量中并不能使代码更清晰,因为你有两个变量而不是一个变量。更有趣的是将非常数移出范围。这样,我们只有变量可见的常量版本,编译器可以防止我们错误地更改它的值。

Herb Sutter 描述了如何使用 C++11 lambdas 来做到这一点:Complex initialization for a const variable

const int i = [&]{
  int i = some_default_value;

  if(someConditionIstrue)
  {
    Do some operations and calculate the value of i;
    i = some calculated value;
  }

  return i;
} ();

(我不解释执行速度目标,因为它已经由 Mats Petersson 完成)。

于 2013-04-29T13:24:01.613 回答
0

为了更好的代码可读性,您可以在变量不再更改的位置创建对变量的 const 引用,并从该点开始使用 const 引用。

double value_init;
// Some code that generates value_init...
const double& value = value_init;
// Use value from now on in your algorithm
于 2013-04-29T13:04:08.763 回答