2015-08-01 18 views
6

Ho una buona conoscenza di come vengono compilati i parametri del modello di tipo. Ma i modelli non di tipo vengono compilati allo stesso modo?Come vengono compilati i parametri del modello non di tipo?

Ad esempio, con un tipo-modello come questo:

template<typename T> 
class TemplatedClass { 
    ..do something with T.. 
}; 
TemplatedClass<int> IntClass; 
TemplatedClass<char> CharClass; 

È possibile che otterrebbe compilato per definizioni distinte classi per int e char:

class TemplatedClass<int> { 
    ..do something with int.. 
}; 
class TemplatedClass<char> { 
    ..do something with char.. 
}; 

Quando templating parametri non-tipo, il compilatore lo fa allo stesso modo? Ad esempio:

template<int N> 
class NumericClass { 
    int array[N]; 
    ..do something else with N.. 
}; 
NumericClass<3> Class3; 
NumericClass<5> Class5; 

Questo genererebbe definizioni di classi separate per ciascuno dei valori numerici come di seguito?

class NumericClass3 { 
    int array[3]; 
    ..do something else with 3.. 
}; 
class NumericClass5 { 
    int array[5]; 
    ..do something else with 5.. 
}; 

Se è così, non potevano che portare ad una tonnellata di codice compilato gonfio se ci sono un gran numero significativo di possibilità numerici per il parametro di modello? Potrei avere una classe array statica definita con un modello numerico nella mia API core. Quindi ogni volta che ho dichiarato un'istanza con un valore di lunghezza univoco, avrebbe dovuto compilare una nuova definizione di classe per esso. Questo potrebbe portare a un numero ridicolmente grande di definizioni compilate, supponendo che il mio codice sia a tempo indeterminato.

Per quanto ne so, questa pratica è ancora incoraggiata. Il compilatore ha un altro modo di gestire i modelli non di tipo allora? O le spese generali da averlo compilato in questo modo non è così significativo?

+6

Sì, ogni numero diverso immetterà classe distinta. –

+0

Bene, se ne hai davvero bisogno (anche dopo eventuali ottimizzazioni), la memoria non può provenire dallo spazio. – edmz

+0

Il [Itanium C++ ABI] (http://mentorembedded.github.io/cxx-abi/abi.html#mangle.template-arg) mostra un modo in cui gli argomenti del modello possono essere alterati nei nomi di (modello di classe, specializzazione per la funzione membro del modello di classe, ..). (Si noti come [le espressioni vengono alterate] (http://mentorembedded.github.io/cxx-abi/abi.html#mangle.expr-primary).) – dyp

risposta

3

Ogni istanziazione modello è concettualmente un'entità diversa. Il compilatore può creare codice diverso per ogni istanza. Non importa se gli argomenti del template sono argomenti di tipo o non di tipo. Il compilatore può essere in grado di condividere il codice tra diverse istanze e dare simboli diversi allo stesso codice oggetto ma non c'è sicuramente alcun mandato per farlo (c'è ancora un po 'di memoria necessaria per i simboli almeno fino a quando il codice non è collegato).

Di conseguenza, può essere importante strutturare le implementazioni in modo da ridurre al minimo il codice specifico degli argomenti del modello. Ad esempio, potrebbe essere ragionevole codificare il codice comune a più istanze in una classe base (presupponendo che la funzionalità debba essere una funzione membro). Per il codice rimanente è ragionevole renderlo piuttosto piccolo in modo che possa essere inline e non creare alcun sovraccarico se è inferiore al codice necessario per chiamare le funzioni e restituire da esse.

Problemi correlati