【问题标题】:Best way to declare intermediate variables in a loop在循环中声明中间变量的最佳方法
【发布时间】:2020-11-21 21:58:37
【问题描述】:

我偶然发现了一段我经常使用的代码,它包括在循环中进行算术运算以更新数量。重要的是我使用的是 独立于循环索引的中间数量。我想出了两种写法。在这个模拟示例中,我使用了标量和向量,但我想这几乎适用于使用循环更新的每个数量:

scalar coef = someComplicatedScalar;
for (i=0; i<n; i++) {
   vector someComplicatedVector;
   stuff[i] = someComplicatedScalar * someComplicatedVector;
}

scalar coef = someComplicatedScalar;
vector someComplicatedVector;
for (i=0; i<n; i++) {
   stuff[i] = someComplicatedScalar * someComplicatedVector;
}

在开发过程中,我主要做第一个。我想知道在代码清理期间是否值得从第一个实现转移到第二个实现。 我担心的是优化,因为 C++ 无法在运行时创建新变量,我担心它会创建一堆无用的副本。

注意:我使用的是 C++ 框架,因此使用了替代类。

【问题讨论】:

  • 恐怕它会创建一堆无用的副本。 -- 编译器的优化器可能很容易确定 vector 是一个不变量,可以移出环形。您还需要确保构建的是代码的优化版本,而不是“调试”或未优化的版本。
  • 看代码不会告诉你太多。您应该分析两个版本,看看哪个更好。
  • 如果值没有改变,更喜欢在循环外使用带有变量的 seconf 表单,为了更清楚起见,您甚至可能想要声明该对象 const 以便立即知道它不会在内部发生变化循环(if 稍微复杂一些)并防止在未来维护期间发生意外更改。
  • 致cigien:我问是因为在这种情况下我有很多变量。这就是我接手时代码的样子,我也没有很注意避免使用表格 1。致 Phil1970:感谢您的建议,尽管我无法声明这些变量中的大部分 const,因为我正在谈论的那些代码位是更复杂的循环系统的一部分(如果您在 Solid Dynamics 代码中使用时间步进循环) '很好奇)。
  • @PaulMcKenzie -- 作为一个不变量是不够的;为了使这种优化有效,对象的构造函数和析构函数不能有可见的副作用。我们不知道这个vector 类型做了什么,但是例如,如果它的构造函数计算已创建的对象的数量,那么将对象移到循环之外会改变计数,并且不是合法的编译器优化。当然,它可以是有效的用户优化。

标签: c++ loops variables optimization


【解决方案1】:

如果编译器找到循环的表达式或操作不变量,它将自动优化您的代码。

但是对于显式优化的动摇,您可以将所有表达式和局部变量的实例化放在循环之外,这些局部变量对于循环是不变的。 这将是优化良好的代码。

【讨论】:

  • 这里要小心。对于内置类型(int 等),这是正确的,因为创建和销毁 int 变量没有副作用。编译器经常将这些家伙提升到顶部并创建一次。但是对于用户定义的类型,构造和销毁对象可能会产生明显的副作用,将这样的对象移出循环并不是有效的优化。例如,考虑一个对象,其构造函数计算已创建对象的数量;将对象移出循环会改变计数,结果不符合语言定义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-16
  • 2016-06-07
  • 1970-01-01
相关资源
最近更新 更多