Questo è un semplice programma in C++ utilizzando valarray:Perché l'ottimizzazione GCC non funziona con 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;
}
Se compilo e correre in questo modo:
g++ -O0 main.cpp && ./a.out
L'uscita è come previsto:
512 256 128
Tuttavia, se Compilare ed eseguire in questo modo:
g++ -O3 main.cpp && ./a.out
L'output è:
0 0 0
Lo stesso accade se uso -O1
parametri di ottimizzazione.
versione GCC è (ultimo di Archlinux):
$ g++ --version
g++ (GCC) 6.1.1 20160707
Tuttavia, se provo con clangore, sia
clang++ -std=gnu++14 -O0 main.cpp && ./a.out
e
clang++ -std=gnu++14 -O3 main.cpp && ./a.out
producono lo stesso risultato corretto:
512 256 128
versione Clang è:
$ clang++ --version
clang version 3.8.0 (tags/RELEASE_380/final)
Ho anche provato con GCC 4.9.2 su Debian, dove eseguibile produce il risultato corretto.
Si tratta di un possibile errore in GCC o sto facendo qualcosa di sbagliato? Qualcuno può riprodurlo?
EDIT: Sono riuscito a riprodurre il problema anche sulla versione Homebrew di GCC 6 su Mac OS.
Utilizzando http://melpon.org/wandbox sembra che i cambiamenti di comportamento da 4.9.3 a 5.1. – NathanOliver
Sfortunatamente, nella mia base di codice sono anche riuscito a riprodurre un problema simile (ma con uint32_t) anche su GCC 4.9.3, tuttavia funziona quando si inserisce un esempio minimo. Sto indagando ... – DoDo