これはvalarraysを使用して簡単なC++プログラムです:GCCの最適化がvalarrayで機能しないのはなぜですか?
#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
出力は次のようになります。私は-O1
最適化パラメータを使用している場合
0 0 0
同じことが起こります。
GCCのバージョンは、(最新のArchlinuxに)ある:
$ g++ --version
g++ (GCC) 6.1.1 20160707
しかし、私は打ち鳴らすとしようとした場合、両方が
clang++ -std=gnu++14 -O0 main.cpp && ./a.out
と
clang++ -std=gnu++14 -O3 main.cpp && ./a.out
が同じ正しい結果を生成します。
512 256 128
クランバージョンです:
$ clang++ --version
clang version 3.8.0 (tags/RELEASE_380/final)
私はまた、実行可能ファイルは、正しい結果を生成するのDebian、上のGCC 4.9.2で試してみました。
これはGCCのバグでしょうか、何か間違っていますか?誰でもこれを再現できますか?
EDIT:私はMacBookのGCC 6の自作バージョンでもこの問題を再現しました。
をhttp://melpon.org/wandboxそれが4.9.3から5.1への動作の変更を表示されます使用します。 – NathanOliver
残念ながら、私のコードベースでは、GCC 4.9.3でも同様の問題(ただしuint32_t)を再現することができましたが、最小限の例ではうまくいきます。私は調査中です... – DoDo