这是一个使用 valarrays 的简单 C++ 程序:
#include <iostream>
#include <valarray>
int main() {
using ratios_t = std::valarray<float>;
ratios_t a{0.5, 1, 2};
const auto& res ( ratios_t::value_type(256) / a );
for(const auto& r : ratios_t{res})
std::cout << r << " " << std::endl;
return 0;
}
如果我像这样编译和运行代码:
g++ -O0 main.cpp && ./a.out
输出结果如预期:
512 256 128
然而,如果我这样编译和运行它:
g++ -O3 main.cpp && ./a.out
输出结果为:
0 0 0
如果我使用-O1
优化参数,同样的情况也会发生。
GCC版本为(在Archlinux中最新):
$ g++ --version
g++ (GCC) 6.1.1 20160707
然而,如果我使用clang尝试,则两者
clang++ -std=gnu++14 -O0 main.cpp && ./a.out
and
clang++ -std=gnu++14 -O3 main.cpp && ./a.out
产生相同正确的结果:
512 256 128
Clang版本为:
$ clang++ --version
clang version 3.8.0 (tags/RELEASE_380/final)
我也尝试过在Debian上使用GCC 4.9.2,可执行文件产生了正确的结果。
这是GCC可能存在的一个bug,还是我做错了什么?有人能复现这个问题吗?
编辑:我成功地在Mac OS上使用Homebrew版本的GCC 6复现了这个问题。