这是一个使用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
和
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中可能存在的错误还是我做错了什么?任何人都可以重现这个吗?
编辑:我设法在Mac OS上的Homebrew版本的GCC 6上重现了这个问题。