Se si dispone di un compilatore che supporta i riferimenti rvalue, verrà spostato nel vettore, che a volte è abbastanza economico.
Un'alternativa è quella di costruire direttamente l'oggetto nel vettore, che può essere fatto con vec.emplace_back("abc");
. Questo richiama solo un costruttore.
Entrambe sono caratteristiche di C++ 11. Copia elision non è consentita qui, quindi senza queste funzionalità la copia verrà comunque eseguita.
Tuttavia, se il costruttore di copia non ha effetti collaterali osservabili (che non dovrebbe avere comunque), un compilatore intelligente può comunque eseguire tale ottimizzazione, perché la regola "as-if" consente qualsiasi ottimizzazione che risulti nel stesso comportamento osservabile. Non so se un compilatore corrente lo faccia, comunque. In caso contrario, dubito che qualcuno spenderà gli sforzi per aggiungere una tale ottimizzazione, perché i riferimenti di valore superiore pongono fine a tale esigenza.
fonte
2012-08-09 02:31:09
Non penso perché 'vector' (in realtà gli allocatori STL) utilizzano il posizionamento' new'. –
@Seth Carnegie - in che modo si riferisce al posizionamento 'new'? Diciamo che hai abbastanza spazio libero nel vettore, quindi un compilatore può semplicemente costruire un'istanza di 'A' sul posto. –
@Nya perché probabilmente il compilatore non capirà dove verrà creato (non che non possa farlo, ma non lo farà, perché gli scrittori di compilatori non hanno scritto quell'ottimizzazione). –