L'uso di std::array<T, N> porta a un ingrossamento del codice?[duplicare]
Domanda
Ho visto in alcuni posti la raccomandazione da utilizzare std::array
rispetto agli array in stile C in C++, sostenendo che è un'alternativa migliore e più sicura senza costi aggiuntivi.Vedere:
L'array contenitore standard [...] non ha spese generali di spazio oltre ciò di cui ha bisogno per mantenere i suoi elementi, [...].In altre parole, è molto simile a un array integrato senza problemi.(Domande frequenti su C++11)
Tuttavia, a quanto ho capito, essendo un contenitore di modelli lì Volere essere un sovraccarico per quanto riguarda la dimensione del programma, poiché genererà codice per ogni diverso N con cui è istanziato un array.
Supponiamo che il mio programma utilizzi std::array
in vari posti con diversi numeri interi diversi per N, questo porterà a un codice gonfio?È trascurabile?
Dovrei preoccuparmi di questo per i parametri del modello non di tipo in generale?
Soluzione
Non me ne preoccuperei.Se guardi l'interfaccia di std::array<T, N>
, è molto piccolo e la maggior parte delle funzioni membro (che sostanzialmente forniscono wrapper per la manipolazione del puntatore) sono di una riga che verranno completamente ottimizzate/incorporate da qualsiasi compilatore decente sui livelli di ottimizzazione della modalità di rilascio.
Inoltre, non paghi per quello che non usi poiché le funzioni membro non virtuali inutilizzate (std::array<T, N>
non ha virtual
è garantito che le funzioni membro) dei modelli di classe non vengano istanziati.Piccolo preventivo standard:
14.7.1 Istanziazione implicita [temp.inst]
11 Un'implementazione non deve implicitamente istanziare un modello di funzione, un modello variabile, un modello di membro, una funzione membro non virtuale, una classe membro o un membro di dati statico di un modello di classe che non richiede l'istanza.[...]
Esistono anche alcuni operatori relazionali sovraccarichi ==
E <
che sono semanticamente equivalenti a std::equal
E std::lexicographical_compare
.In pratica, anche questi operatori dovrebbero essere implementati in termini di questi algoritmi (se non lo fanno, lamentati con il tuo fornitore).
L'unica piccola preoccupazione è un piccolo sovraccarico aggiuntivo in fase di compilazione, ma non dovrebbero esserci dimensioni del codice e sovraccarico in fase di esecuzione pari a zero.
Correlati ma non identici:IL Rapporto tecnico sulle prestazioni C++ ha eseguito molti benchmark accurati sui wrapper di classe sottile attorno ai tipi incorporati (int
, double
) e ha riscontrato un sovraccarico vicino allo zero per la tecnologia del compilatore del 2006.Potresti ripetere i test per verificarlo std::array<T,N>
contro T[N]