我有一个简单的示例进行测试,发现在涉及operator new时,gcc优化(-O3)似乎不如clang。我想知道可能的问题,并且是否可能以某种方式强制gcc生成更多优化的代码?
template<typename T>
T* create() { return new T(); }
int main() {
auto result = 0;
for (auto i = 0; i < 1000000; ++i) {
result += (create<int>() != nullptr);
}
return result;
}
#clang3.6++ -O3 -s --std=c++11 test.cpp
#size a.out
text data bss dec hex filename
1324 616 8 1948 79c a.out
#time ./a.out
real 0m0.002s
user 0m0.001s
sys 0m0.000s
#gcc4.9 -O3 -s --std=c++11 test.cpp
#size a.out
text data bss dec hex filename
1484 624 8 2116 844 a.out
#time ./a.out
real 0m0.045s
user 0m0.035s
sys 0m0.009s
上面的示例只是我一开始测试代码的简单版本,但它仍然说明了gcc/clang之间的差异。我也检查了汇编代码,在大小上并没有太大的区别,但在性能上肯定有差异。另一方面,也许clang正在做一些不允许的事情?
clang
似乎把所有代码优化成了一个movl $1000000, %eax
操作,而gcc
则没有。 - Shafik Yaghmournew
抛出异常,那么程序的返回值将会改变,据我所知这属于可观察行为。 - Shafik Yaghmour