這是一個簡單的C++程序使用valarrays:爲什麼GCC優化不適用於valarrays?
#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中的一個可能的錯誤還是我做錯了什麼?任何人都可以重現嗎?
編輯:我設法在Mac OS上的GCC 6的自制版本上也重現該問題。
使用http://melpon.org/wandbox它似乎從4.9.3到5.1的行爲更改。 – NathanOliver
不幸的是,在我的代碼庫中,我甚至在GCC 4.9.3上也設法重現了類似的問題(但是使用了uint32_t),但是它在最小的例子中起作用。我正在調查... – DoDo