Als ich die Antwort auf this question las, war ich überrascht zu sehen, dass std::min(std::initializer_list<T>)
seine Argumente nach Wert nimmt.Warum nimmt std :: min (std :: initializer_list <T>) Argumente nach Wert?
Wenn Sie std::initializer_list
in der Weise verwenden, die durch seinen Namen impliziert wird, d. H. Als Initialisierer für ein Objekt, verstehe ich, dass wir seine Elemente nicht kopieren, da sie sowieso kopiert werden, um das Objekt zu initialisieren. In diesem Fall benötigen wir hier jedoch höchstwahrscheinlich keine Kopie, so dass es viel vernünftiger erscheint, die Argumente als std::initializer_list<const T&>
zu nehmen, wenn es nur möglich wäre.
Was ist die beste Vorgehensweise für diese Situation? Sollten Sie nicht die initializer_list
Version von std::min
anrufen, wenn Sie nicht unnötige Kopien machen wollen, oder gibt es einen anderen Trick, um die Kopie zu vermeiden?
AFAIK, die Verwendung einer Referenz benötigt mehr CPU-Zyklen als die Übergabe einer 'int's-Kopie und benötigt mehr Speicher (mindestens auf x86) als die Übergabe kleinerer Variablen. – GingerPlusPlus
True, aber std :: min ist nicht auf int (oder einen beliebigen numerischen Typ) beschränkt. Und bei großen Objekten kann es sehr wichtig sein, auf die Kopie zu verzichten. – gTcV
Ich denke, der Grund ist in [N2722] (http://open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2722.pdd) beschrieben, obwohl ich diesen Leistungsvergleich und das Fazit. Es könnte irgendwo mehr Diskussionen geben. – dyp