Почему оптимизация GCC не работает с valarrays?
Это простая программа на C ++, использующая 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
Выход:
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)
Я также пытался с GCC 4.9.2 на Debian, где исполняемый файл дает правильный результат.
Это возможная ошибка в GCC или я делаю что-то не так? Кто-нибудь может воспроизвести это?
РЕДАКТИРОВАТЬ: Мне удалось воспроизвести проблему также на Homebrew версии GCC 6 для Mac OS.