【发布时间】: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