2015-10-22 5 views
8

diese Aussage Given (die, wie Nebenbei bemerkt, nicht meine bevorzugte Art der Programmierung ist)If-Anweisung in C++ mit leerem Rumpf: Ist die Bedingung garantiert ausgewertet?

if(doSomething()) {} 

Does ‚der C++ Standard‘ Garantie, dass die Funktion aufgerufen wird? (It Rückgabewert hat keine Auswirkungen auf dem Ausführungspfad, so dass der Compiler kann den Ideen der Verknüpfung Auswertung folgen und es weg zu optimieren.)

+2

Ja, der Standard garantiert dies und ein Optimierer darf den semantischen Effekt nicht ändern. –

+0

Sie können einfach '(void) doSomething();' schreiben, wenn Sie den Rückgabewert explizit verwerfen möchten. – Useless

Antwort

8

Es gibt keinen Kurzschluss Betreiber beteiligt, so wird die Funktion garantiert aufgerufen werden wenn es nicht weg optimiert werden kann, ohne Nebenwirkungen zu beseitigen. Unter Angabe der C++ 11-Standard:

[...] konforme Implementierungen sind erforderlich, um (nur) das beobachtbare Verhalten der abstrakten Maschine zu emulieren wie unten erläutert.

Diese Bestimmung wird manchmal als „as-if“ -Regel [...] eine tatsächliche Umsetzung muss nicht Teil eines Ausdrucks zu bewerten, wenn es, dass sein Wert nicht und verwendet ableiten kann keine Nebenwirkungen Auswirkungen auf das beobachtbare Verhalten des Programms werden produziert.

So etwas wie

int doSomething() { return 1; } 

könnte weg optimiert werden, aber

int doSomething() { std::cout << "d\n"; return 1; } 

nicht gestattet.

Darüber hinaus können Sie seit C++ 11 komplexere Funktionen schreiben und sie dennoch zur Kompilierzeit mithilfe von constexpr ausgewertet werden.

Verwandte Themen