QVector :: append () welcher Grund für das explizite Kopieren?

9
%Vor%

Was ist der Grund dafür, const T copy(t) anstelle von t by value in die Methode zu übernehmen? Was ist der Unterschied zwischen diesen und:

%Vor%     
Grief 11.06.2015, 20:28
quelle

2 Antworten

2

QVector erfordert Elemente zuweisbare Datentypen , was bedeutet sie

  

muss einen Standardkonstruktor, einen Kopierkonstruktor und eine Zuweisung bereitstellen   Betreiber.

Ihre Version von append erzwingt alle, während Ihre Version Konstruktion nicht erzwingen erzwingt, wenn QTypeInfo<T>::isComplex falsch und optimiert weg ist.

Hinweis: QTypeInfo<T>::isComplex wird zur Kompilierzeit aufgelöst.

Ich vermute, dass es sich um eine Legacy-Anforderung handelt, da QVector bereits in Qt2 existiert , deren Datum von% stammt. co_de% lange vor C ++ Standardisierung.

    
UmNyobe 22.06.2015 16:50
quelle
2

Ich kann mir zwei mögliche Gründe vorstellen.

  1. Es folgt der Stil des Rests der STL, kopieren und tauschen und übergeben durch const & amp ;. Keine von diesen macht in dieser Situation eine gute Leistung oder eine korrekte Richtigkeit; aber es hält den Stil konsistent.

  2. Da der Parameter an eine Referenz gebunden ist, vermeidet er die Eliminierung der Kopie beim Funktionsaufruf. Und weil die Elemente in einem Vektor zuweisbar sein müssen (dh nicht const), vermeidet es die Elision bei der Zuweisung in den Vektor

Dies macht den Code VIEL über Compiler portabler und konsistenter. Das ist wahrscheinlich eine große Sache für die STL.

Elision-Wikipedia-Eintrag kopieren

  

31) Wenn bestimmte Kriterien erfüllt sind, darf eine Implementierung den Kopier- / Verschiebungsaufbau eines Klassenobjekts auslassen, selbst wenn der Kopier- / Verschiebungskonstruktor und / oder der Destruktor für das Objekt Nebenwirkungen haben. In solchen Fällen behandelt die Implementierung die Quelle und das Ziel der ausgelassenen Kopier- / Verschiebungsoperation als einfach zwei verschiedene Arten, auf dasselbe Objekt zu verweisen, und die Zerstörung dieses Objekts erfolgt zu dem späteren Zeitpunkt, zu dem die beiden Objekte gewesen wären Ohne die Optimierung zerstört.123 Diese Eliminierung von Kopier- / Verschiebeoperationen, die als Kopier-Elision bezeichnet wird, ist unter den folgenden Umständen zulässig (die kombiniert werden können, um mehrere Kopien zu eliminieren):

     

- wenn ein temporäres Klassenobjekt nicht an eine Referenz gebunden ist   (12.2) würde mit demselben in ein Klassenobjekt kopiert / verschoben werden   cv-unqualified type, kann der Kopier- / Verschiebevorgang weggelassen werden   Konstruieren des temporären Objekts direkt in das Ziel der   ausgelassen kopieren / verschieben

    
8bitwide 22.06.2015 19:28
quelle

Tags und Links