Leggendo la risposta a this question, sono stato sorpreso di scoprire che std::min(std::initializer_list<T>)
prende i suoi argomenti in base al valore. Se si utilizza std::initializer_list
nel modo implicito dal suo nome, vale a dire come inizializzatore di un oggetto, capisco che non ci interessa copiare i suoi elementi poiché saranno comunque copiati per inizializzare l'oggetto. Tuttavia, in questo caso qui molto probabilmente non abbiamo bisogno di alcuna copia, quindi sembrerebbe molto più ragionevole prendere gli argomenti come std::initializer_list<const T&>
se solo fosse possibile.Perché std :: min (std :: initializer_list <T>) prende gli argomenti in base al valore?
Qual è la migliore pratica per questa situazione? Non dovresti chiamare la versione initializer_list
di std::min
se non ti interessa fare copie non necessarie, o c'è qualche altro trucco per evitare la copia?
AFAIK, l'utilizzo di un riferimento richiede più cicli della CPU che passare una copia di 'int' e richiede più memoria (almeno su x86) rispetto al passaggio di variabili più piccole. – GingerPlusPlus
Vero, ma std :: min non è limitato a int (o qualsiasi tipo numerico). E per oggetti di grandi dimensioni può essere * molto * importante rinunciare alla copia. – gTcV
Penso che la ragione sia descritta in [N2722] (http://open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2722.pdd), anche se sono riluttante a fidarmi di quel confronto di prestazioni e la conclusione. Potrebbe esserci più discussione registrata da qualche parte. – dyp