2016-04-29 10 views
4

ich diesen Arbeits Code in einem Buch auf Metaprogrammierung gefunden -Beschreiben Sie den Speicherverbrauch dieser Metaprogramm

template<unsigned long N> 
struct binary 
{ 
    static unsigned const value = binary<N/10>::value *2 + N%10;  
}; 

template<> 
struct binary<0> 
{ 
    static unsigned const value = 0; 
}; 

int main() 
{ 
    unsigned x = binary<101010>::value; 
    cout << x; 
} 

Meine Frage ist - wo ist der Speicher für value zugewiesen? Ist es auf dem Datensegment zugeordnet?

Das Buch sagt auch, dass dieser Code zu einer Kaskade von Template-Instanziierungen führt, die das Ergebnis ähnlich wie Rekursion berechnen. Bedeutet dies, dass für jede Template-Instanziierung ein neues unsigned auf dem Datensegment zugewiesen wird?

Antwort

6

value hat keine Definition. Solche statischen Datenelemente können nur so verwendet werden, dass sie keine Adresse benötigen (sie können nicht oder sein). Ihre Werte werden inline angezeigt, als ob Sie unsigned x = 42; hätten.

Natürlich muss der Compiler irgendwie alle Template-Spezialisierungen instanziieren und binary<101010>::value berechnen. Aber das ist nicht mehr wichtig, nachdem die Kompilierung abgeschlossen ist.

3

Wenn Sie einen guten C++ - Compiler verwenden, wird kein Speicher überall zugewiesen. Der C++ - Compiler wird diese Klasse vollständig optimieren und die berechnete Konstante direkt in dem Code verwenden, der sie verwendet.