【发布时间】:2015-05-15 04:40:12
【问题描述】:
假设你有一个这样的类:
class A {
public:
A(const size_t m, const size_t n) :
m_(m), n_(n), data_(m*n ? new double[m*n] : nullptr) {}
~A() { delete[] data_; }
void foo() const {
// m_*n_ evaluated each iteration?
for (size_t i = 0; i<m_*n_; ++i)
data_[i] = 0.0;
// this probably wont but what about the above?
for (auto& i : *this)
i = 0.0;
}
double* begin() const { return data_; }
double* end() const { return data_ + m_*n_; }
private:
size_t m_, n_;
double* data_;
};
由于 foo 是 const 而 m_,n_ 是成员变量,编译器应该知道这些不能改变。是每次都对产品进行评估,还是编译器会对其进行优化?
【问题讨论】:
-
这取决于编译器、它的具体优化设置、火星和月球的相对位置等。但这真的很重要吗?你有没有通过基准测试发现这是您代码中的一个重要瓶颈吗?如果没有,请不要打扰。
-
您可以随时查看程序集,看看它在做什么。
-
实际上,编译器应该看到
m_和n_在循环期间不会发生变化,并将计算提升到循环之外。 -
为什么不在循环之前进行计算并将结果发送到另一个变量,然后用于循环绑定?这样您就可以 100% 确定您的编译器不会在每次迭代时重新计算乘积。我不知道编译器是否重新计算,但我知道如果您使用字符串长度函数来确定长度并且这在循环范围内,例如
for(int i=0; i<strlen(mystring); i++),编译器将重新计算字符串长度每次。
标签: c++ c++11 for-loop optimization