2017-04-01 2 views
2

Haftungsausschluss: Diese Frage ist ein wenig kompliziert, weil es mehrere Fragen in einem ist, aber sie sind alle auf die gleiche Art von Konzept/Problem bezogen.Können C++ - Compiler das Ergebnis von conexpr-Funktionen zwischenspeichern?

Premise: consexpr Funktionen nur aus einer einzigen return Anweisung bestehen.

Sie können andere Funktionen aufrufen und Conditionals verwenden, aber theoretisch sollten sie funktionale Reinheit demonstrieren, und daher sollten die Ergebnisse in einer Art von Karte (durch den Compiler, zur Kompilierzeit) gespeichert werden können, so dass der Compiler nicht hat die gleiche Funktion ständig neu zu bewerten.

Frage (n): Ist diese Annahme richtig oder gibt es etwas, das ich nicht in Betracht gezogen, die es unmöglich macht, das Ergebnis einer constexpr Funktion cachen? Wenn nein, bedeutet dies, dass constexpr Funktionen jedes Mal berechnet werden müssen, wenn sie verwendet werden?

Was ist mit template s? Sind constexpr Werte auf template s abrufbar oder müssen sie auch jedes Mal neu berechnet werden?

+0

'consexpr'-Funktionen können oft zur Kompilierzeit ausgewertet werden; Das ist der Sinn der Übung. In diesem Fall endet der ausführbare Code mit der Konstante, die das Ergebnis der Auswertung des Funktionsaufrufs ist, nicht aber der Code für die Funktion selbst. Das ist das ultimative Caching. Oder fragen Sie, ob der Compiler mehrere Auswertungen zur Kompilierzeit optimieren kann? Wahrscheinlich, aber ich bin mir nicht sicher, warum es dich interessieren würde. –

+0

Warum sollte es dich interessieren? Welchen Unterschied macht es zu Ihrem Programm? –

+0

@IgorTandetnik Ich meine, nimmt der Compiler an, dass die Funktion rein ist, cache das Ergebnis für eine gegebene Eingabe unter Verwendung einer Karte und befrage von nun an den Cache (d. H. Die Karte), anstatt die Funktion ständig neu zu bewerten? – Pharap

Antwort

1

Ich glaube nicht, constexpr Funktionen müssen rein sein - zumindest nicht für alle möglichen Argumente. Überlegen:

#include <iostream> 
#include <stdlib.h> 

constexpr int f(int n) { return n == 0 ? 42 : rand(); } 

template <int n> void g() {} 

int main() 
{ 
    g<f(0)>(); // OK 
// g<f(1)>(); // error 
    std::cout << f(0) << ' ' << f(1) << ' ' << f(2); 
} 

Ausgabe: 42 1804289383 846930886. Demo

+0

Das ist ein sehr merkwürdiges Verhalten. Ich bin mir ziemlich sicher, dass 'rand' nicht' consxpr' ist, daher finde ich es sehr merkwürdig, dass eine 'constexpr'-Funktion es als gültig akzeptieren würde. – Pharap

+1

@Pharap gibt es definitiv keine Anforderung, dass eine consExpr-Funktion nur Aufrufe anderer constexpr-Funktionen enthält. –

Verwandte Themen