【发布时间】:2018-10-02 23:05:11
【问题描述】:
我想知道在 c++ 中是否有某种优化或缓存可以防止重复常量之间的相同数学运算,尤其是在循环中,从而降低应用程序性能。 例如:
for (int i = 0; i <= 100; i ++)
std::cout << i << "meters / s:" << "=" << i * (3600/1000) << "Km / h" << endl;
上面的例子显然是虚构的,但这只是为了说明情况。它可能是一百万次循环,包含数百次涉及重复常数的计算。
那我问:
- “(3600/1000)”计算是否会重复运行 100 次循环?
- 这样,为了避免性能损失,我是否应该在循环之前将此计算存储在一个常量变量中并通过该变量更改计算?
- 或者我不必担心,因为 c++ 提供了一种自动优化这些情况以避免性能损失的方法?
- 或者即使我将 3600 更改为常数“a”,将 1000 更改为常数“b”,也就是说,即使“a”和“b”是常数,我也不会使用 3600/1000,而是使用“a / b”,但是操作是重复计算100次还是有什么优化?
我知道这个问题很中肯,因为它涉及到应该采用的编程风格。
【问题讨论】:
-
这取决于你的编译器。大多数现代编译器会将其优化为常量。
-
你真的不需要担心。编译器足够聪明,可以在编译时将
3600/1000替换为360。 -
C++ 明确允许编译器实现任何没有可观察到的效果的优化。执行您概述的优化没有可观察到的效果,因此这是允许的。 C++标准不要求编译器实现这种优化,只允许;但实际上所有现代 C++ 编译器都会这样做,尤其是当它只涉及常量时。
-
几乎所有编译器都会优化掉文字计算。顺便说一句,像你这样的小循环(0到100)你担心不必要的优化
-
我猜你的意思是 3.6 但是.. 在我看来它会导致 3 代替? int 的 3600 / int 的 1000 看起来像 3。如果您没有为新生处理器使用非常有趣的所谓研究编译器,那么您提到的任何一个都应该导致编译时间常数计算。
标签: c++ performance caching optimization constants