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?
Sì, ogni numero diverso immetterà classe distinta. –
Bene, se ne hai davvero bisogno (anche dopo eventuali ottimizzazioni), la memoria non può provenire dallo spazio. – edmz
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