compile mit -O3 ; Werden Initialisatoinen optimiert?
-
Optimieren moderne c++ compiler die initialisierung von variablen? Beispiel:
int number = 100;
Das ist ja ein copy-initializer.
Direkt und schneller? wäreint number {100};
Ändern compiler so was? Oder ist das Blösdinn?
-
Ja, Compiler optimieren sowas.
Compiler optimieren sogar noch viel mehr.Z.B. wird das:
int test() { int sum = 0; for (int i = 0; i < 50; i++) sum += i; return sum; }
zu dem optimiert:
test(): mov eax, 1225 ret
Falls du nicht Assembler kannst: das ist equivalent zu
return 1225;
.
-
Ich verstehe nicht, wieso wer zu der Annahme gelangt,
@MegaV0lt sagte in compile mit -O3 ; Werden Initialisatoinen optimiert?:
{100};
sei schneller als
@MegaV0lt sagte in compile mit -O3 ; Werden Initialisatoinen optimiert?:
= 100;
! Bitte näher begründen.
Ansonsten kann der Compiler glaube ich auch disassemblen, also "zurückübersetzen". Bitte davon Gebrauch machen.
-
@wpi
Weil das eine formal eine direkte Initialisierung ist und das andere formal "copy initialization".Direkte Initialisierung heisst das Objekt wird eben direkt initialisiert.
Und "copy initialization" heisst das Objekt wird mittels des Copy-Konstruktors initialisiert. Und dazu muss ggf. zuerst ein temporäres Objekt des passenden Typs erzeugt werden. In alten C++ Standard war es erlaubt dass der Compiler das optimiert und eine direkte Initialisierung draus macht. Es war aber nicht gefordert. Seit C++17 ist diese Optimierung nun gefordert, der Compiler muss sie machen.
Wobei das bei Integers mehr oder weniger irrelevant ist, da hier sowieso die "as if" Regel gilt.
! Bitte näher begründen.
Nur weil du etwas nicht verstehst, heisst das nicht dass die Frage unsinnig ist.
Ansonsten kann der Compiler glaube ich auch disassemblen, also "zurückübersetzen". Bitte davon Gebrauch machen.
Lol. Ist das jetzt dein Forum und du bestimmst was gefragt werden darf und was nicht?
-
Vielen Dank für die Antworten
@hustbaer sagte in compile mit -O3 ; Werden Initialisatoinen optimiert?:
Seit C++17 ist diese Optimierung nun gefordert, der Compiler muss sie machen.
Das wusste ich nicht. Wird das auch bei anderen Initialisierungen so 'optimiert'?
-
@hustbaer sagte in compile mit -O3 ; Werden Initialisatoinen optimiert?:
Seit C++17 ist diese Optimierung nun gefordert, der Compiler muss sie machen.
Das ist mir auch neu. Wo steht das. Ich finde das so nicht beschrieben...
Der MS Compiler macht dies seit dem ich damit arbeite, aber eben nur wenn er es auch aufgrund der Deklarationen kann.
Bei primitiven Datentypen ist das ja auch einfach.
-
@hustbaer sagte in compile mit -O3 ; Werden Initialisatoinen optimiert?:
Lol. Ist das jetzt dein Forum und du bestimmst was gefragt werden darf und was nicht?
Warum so aggressiv? Ich habe dir doch überhaupt nichts getan.
Das war ein freundlich gemeinter Tipp gewesen. Wir sind in einem Forum. Dort werden Fragen gestellt und Mitglieder antworten nach bestem Wissen und Gewissen darauf. Nicht mehr oder weniger.
Unfreundlichkeit mag aber keiner gern ...
-
@hustbaer sagte in compile mit -O3 ; Werden Initialisatoinen optimiert?:
Und "copy initialization" heisst das Objekt wird mittels des Copy-Konstruktors initialisiert. Und dazu muss ggf. zuerst ein temporäres Objekt des passenden Typs erzeugt werden. In alten C++ Standard war es erlaubt dass der Compiler das optimiert und eine direkte Initialisierung draus macht. Es war aber nicht gefordert. Seit C++17 ist diese Optimierung nun gefordert, der Compiler muss sie machen.
Eine interessante Konsequenz aus dieser Anforderung ist übrigens, dass diese Optimierung ab C++17 auch mit
-O0
erfolgen muss. Optimierungen unter-O3
sind ja Thema des Threads.
-
@Martin-Richter sagte in compile mit -O3 ; Werden Initialisatoinen optimiert?:
@hustbaer sagte in compile mit -O3 ; Werden Initialisatoinen optimiert?:
Seit C++17 ist diese Optimierung nun gefordert, der Compiler muss sie machen.
Das ist mir auch neu. Wo steht das. Ich finde das so nicht beschrieben...
Die Stelle im Standard kann ich dir nicht sagen. Aber https://en.cppreference.com/w/cpp/language/copy_initialization sagt
First, if T is a class type and the initializer is a prvalue expression whose cv-unqualified type is the same class as T, the initializer expression itself, rather than a temporary materialized from it, is used to initialize the destination object: see copy elision. (since C++17)
-
Jo. Danke!
Der Artikel beschreibt es eindeutig.
https://en.cppreference.com/w/cpp/language/copy_elision