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?

È stato utile?

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]

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top