Jest to prosty program w C++ z wykorzystaniem valarrays:Dlaczego optymalizacja GCC nie działa z 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;
}
Jeśli mogę skompilować i uruchomić go tak:
g++ -O0 main.cpp && ./a.out
Wyjście jest zgodnie z oczekiwaniami:
512 256 128
Jednakże, jeśli Kompiluję i uruchamiam w następujący sposób:
g++ -O3 main.cpp && ./a.out
Wyjście jest:
0 0 0
To samo dzieje się, jeśli mogę użyć -O1
parametr optymalizacji.
wersja GCC jest (ostatnie w ArchLinux):
$ g++ --version
g++ (GCC) 6.1.1 20160707
Jednak gdy próbuję z brzękiem, zarówno
clang++ -std=gnu++14 -O0 main.cpp && ./a.out
i
clang++ -std=gnu++14 -O3 main.cpp && ./a.out
produkują ten sam wynik poprawny:
512 256 128
wersja Clang to:
$ clang++ --version
clang version 3.8.0 (tags/RELEASE_380/final)
Ja również próbowałem z GCC 4.9.2 na Debianie, gdzie wykonywalny produkuje poprawny wynik.
Czy jest to możliwy błąd w GCC lub czy robię coś nie tak? Czy ktoś może to odtworzyć?
EDYCJA: Udało mi się odtworzyć problem również w wersji Homebrew GCC 6 na Mac OS.
Korzystanie http://melpon.org/wandbox Wydaje się, że zmiany w zachowaniu od 4.9.3 do 5.1. – NathanOliver
Niestety, w moim codebase udało mi się również odtworzyć podobny problem (ale z uint32_t) nawet w GCC 4.9.3, jednak działa on po umieszczeniu w minimalnym przykładzie. Prowadzę dochodzenie ... – DoDo