Warum wird das nicht rausoptimiert?
-
#include <limits> using namespace std; int main() { double a = 5.; for(long long y=0; y<std::numeric_limits<long long>::max(); y++) { a *= a; a /= a; } return 0; }
Visual Studio 2010 release mode.
Hatte erwartet, dass sich das Fenster sofort schließt, wegen rausoptimierung.
Tuts aber nicht...
Sind moderne compiler (oder nur der MSVC?) wirklich so schlecht?
-
Musst halt die Optimierung höher stellen, dann optimiert der das auch raus.
g++ mit -O0 macht es nicht weg, -O1 hingegen schon.
-
Wie gesagt ich benutze MSVC 2010 im release mode
Einstellunge sind atm:/Zi /nologo /W3 /WX- /O2 /Oi /Oy- /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm- /EHsc /MT /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Yu"StdAfx.h" /Fp"Release\MPIRTest.pch" /Fa"Release\" /Fo"Release\" /Fd"Release\vc100.pdb" /Gd /analyze- /errorReport:queue
oder nochmal die wichtigen sachen als text:Optimierung: Geschwindigkeit maximieren (/O2)
Inlinefunktionserweiterung: Standard
Systeminterne Funktionen aktivieren: Ja (/Oi)
Größeoder Geschwindigkeit bevorzugen: Weder noch
Framezeiger unterdrücken: Nein (/Oy-)
Fiber-sichere Optimierung aktiveiren: Nein
Optimierung des gesamten Programms: Ja(/GL)Was soll ich ändern?
-
long long wird wohl nicht weg optimiert. Du solltest das mit long testen.
Edit:
Wie erwartet wird die Rechnung mit long vollständig entfernt. Eventuell weiß ja jemand warum long long ausgelassen wird. Bei mir hat ein long long 64 bit, aber ich habe ein 32 bit System.
-
vielleicht hat sich das nicht gelohnt für long long ne optimierung einzubauen weil das eh keiner benutzt
-
Hab long long genommen um sicher zu gehen, dass es nicht sofort weggeht weil die rechnung zu schnell ist^^
Dann bin ich ja beruhigt wenn das wenigstens bei "normaleren" typen klappt.
Ich werds gleich auch nochmal versuchen.