写任何逻辑上最有意义的东西(通常更接近使用)。编译器可以并且将会发现这样的事情并生成对您的目标架构最有意义的代码。
您的时间远比试图猜测编译器和处理器缓存的交互更有价值。
例如在 x86 上这个程序:
#include <iostream>
int main() {
for (int j = 0; j < 1000; ++j) {
std::cout << j << std::endl;
}
int i = 999;
std::cout << i << std::endl;
}
相比:
#include <iostream>
int main() {
int i = 999;
for (int j = 0; j < 1000; ++j) {
std::cout << j << std::endl;
}
std::cout << i << std::endl;
}
编译:
g++ -Wall -Wextra -O4 -S measure.c
g++ -Wall -Wextra -O4 -S measure2.c
当使用diff measure*.s 检查输出时:
< .file "measure2.cc"
---
> .file "measure.cc"
即使是:
#include <iostream>
namespace {
struct foo {
foo() { }
~foo() { }
};
}
std::ostream& operator<<(std::ostream& out, const foo&) {
return out << "foo";
}
int main() {
for (int j = 0; j < 1000; ++j) {
std::cout << j << std::endl;
}
foo i;
std::cout << i << std::endl;
}
对
#include <iostream>
namespace {
struct foo {
foo() { }
~foo() { }
};
}
std::ostream& operator<<(std::ostream& out, const foo&) {
return out << "foo";
}
int main() {
foo i;
for (int j = 0; j < 1000; ++j) {
std::cout << j << std::endl;
}
std::cout << i << std::endl;
}
g++ -S 生成的程序集的差异结果除了文件名之外仍然相同,因为没有副作用。如果有副作用,那么这将决定您在哪里构建对象 - 您希望在什么时候出现副作用?