Dies ist ein einfaches C++ Programm valarrays:Warum funktioniert die GCC-Optimierung nicht mit 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;
}
Wenn ich es so kompilieren und ausführen:
g++ -O0 main.cpp && ./a.out
Der Ausgang wird wie erwartet:
512 256 128
Wenn jedoch Ich kompiliere und laufe es so:
g++ -O3 main.cpp && ./a.out
Die Ausgabe lautet:
0 0 0
Gleiche passiert, wenn ich -O1
Optimierungsparameter verwenden.
GCC-Version (neueste in Archlinux):
$ g++ --version
g++ (GCC) 6.1.1 20160707
Wenn ich jedoch mit Klirren versuchen, beide
clang++ -std=gnu++14 -O0 main.cpp && ./a.out
und
clang++ -std=gnu++14 -O3 main.cpp && ./a.out
die gleiche korrekte Ergebnis produzieren:
512 256 128
Clang Version ist:
$ clang++ --version
clang version 3.8.0 (tags/RELEASE_380/final)
ich auch mit GCC 4.9.2 auf Debian versucht haben, in denen ausführbare Datei das richtige Ergebnis erzeugt.
Ist das ein möglicher Fehler in GCC oder mache ich etwas falsch? Kann das jemand reproduzieren?
EDIT: Ich habe es geschafft, das Problem auch auf Homebrew-Version von GCC 6 auf Mac OS zu reproduzieren.
Mit http://melpon.org/wandbox es die Verhaltensänderungen von 4.9.3 auf 5.1 erscheint. – NathanOliver
Leider habe ich es in meiner Codebase auch geschafft, ähnliches Problem (aber mit uint32_t) sogar auf GCC 4.9.3 zu reproduzieren, allerdings funktioniert es bei minimalem Beispiel. Ich untersuche ... – DoDo