C++ 将值复制到常量中以进行优化

C++ 将值复制到常量中以进行优化,c++,algorithm,variables,optimization,constants,C++,Algorithm,Variables,Optimization,Constants,假设您的第一个目标是执行速度,然后是代码清洁度,最后是资源使用率 如果在算法的某个点上变量(例如double)不再更改(但仍要多次读取),是否将其复制为常量值?为了提高代码可读性,可以在变量不再更改的点上创建常量引用,并从该点开始使用const引用 double value_init; // Some code that generates value_init... const double& value = value_init; // Use value from now on i

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


如果在算法的某个点上变量(例如double)不再更改(但仍要多次读取),是否将其复制为常量值?

为了提高代码可读性,可以在变量不再更改的点上创建常量引用,并从该点开始使用const引用

double value_init;
// Some code that generates value_init...
const double& value = value_init;
// Use value from now on in your algorithm

如果你想让你的代码更清晰,无论如何,把你的值复制到一个
const double const\u value=computed\u值,但编译器非常擅长跟踪依赖项,而且(假设您使用的是一个现代的、能力相当强的编译器)代码不太可能因为您这样做而更快或“更好”。有一个很小的机会,编译器会接受您的话,因为您需要第二个变量,因此生成了一个副本,并因此使代码变慢


一如既往,如果性能对您的应用程序很重要,请为您的特定代码制定一个“前后”比较基准,因为在internet上阅读页面或询问其他问题与对代码进行基准测试并不相同

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

Herb Sutter介绍了如何使用C++11 lambdas:实现这一点


(我不解释执行速度目标,因为Mats Peterson已经完成了这一目标)。

编译器很可能会检测到您的变量不会再被更改,并根据这一观察结果进行优化(如果可以的话)。现在,如果它能让代码更清晰,那就继续吧。但是你可能不应该太担心这样的“优化”。我认为,赫伯·萨特在这里准确地描述了这个问题:@EvgenyKluev:这是一个很好的提示。你为什么不回答呢?我很乐意支持这一点。@EvgenyKluev:即使没有lambda,我也经常使用
static
函数进行初始化。。。请注意,我在萨特的帖子中没有看到关于性能的声明。就我个人而言,我希望这个习语不要被确立,它是垃圾。给lambda起个名字,然后我们就开始讨论。我认为Mats Peterson的答案与这个问题更相关,但lambda的这种用法很好,不幸也有点不灵活:假设操作也直接带来了第二个初始化值j(对于另一个变量,假设我们正在计算sincos),您将无法返回它进行分配。@DarioP:要初始化第二个/第三个。。。这个lambda变量可以返回一对、一个元组或一个结构。但这就不那么方便了。
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;
} ();