2017-01-25 9 views
4

Als Beispiel:Warum bewertet GCC constexpr nicht zur Kompilierzeit?

class something { 
public: 
    static constexpr int seconds(int hour, int min, int sec) 
    { return hour*3600+min*60+sec; } 
} 

dann:

printf("Look at the time: %d\n", something::seconds(10, 0, 0)); 

zu einem Aufruf der Funktion kompilieren mit g ++, anstatt einer konstanten Anzahl setzen. Warum würde g ++ das tun? Es hat keinen Gewinn und widerspricht irgendwie dem Zweck, conetexpr anstelle von schrecklichen Makros zu verwenden.

+1

Welche Optimierungsflags verwenden Sie? –

+2

@NeilButterworth sicherlich kann der Compiler den Aufruf Something :: Sekunden mit dem Ergebnis zur Kompilierzeit ersetzen? Was hat das damit zu tun, dass es ein Parameter für eine variadische Funktion ist? – Kevin

+0

Kann nicht reproduziert werden. Geben Sie die g ++ - Version und die Optimierungseinstellung ein. In der Tat, auch ohne constexpr würde jeder vernünftige Compiler den Aufruf durch eine Konstante ersetzen. – SergeyA

Antwort

14

Warum würde g ++ das tun?

constexpr Funktionen nur müssen bei der Kompilierung in Situationen ausgewertet werden, wenn das Ergebnis als ein konstanter Ausdruck verwendet wird. Dazu gehören Dinge wie die Initialisierung einer constexpr Variablen und die Verwendung als Template-Argument.

In anderen Situationen, selbst wenn eine constexpr-Funktion mit Argumenten aufgerufen wird, die alle selbst konstante Ausdrücke sind, liegt es an der Implementierung, das zu tun, was sie will. Normalerweise hängt es von den Optimierungsflags ab. Sowohl auf gcc 6.2 als auch auf clang 3.9.1 wird zum Beispiel -O0 zur Laufzeit einen Aufruf senden, aber -O1 wird die Konstante 36000 ausgeben.

+0

Godbolt (http://gcc.godbolt.org/) ist dein Freund ... Wenn du den obigen Code in godbolt steckst, wird er im obigen einfachen Fall in einen Kompilierzeitwert von 36000 kompiliert. –

+0

@AndreKostur ... mit '-O1' oder höher, ja. – Barry

Verwandte Themen