Frage

Ich habe eine Funktion, dass sieht wie folgt aus:

// Fetch 1 MB of data
void GetData(std::vector<char> & outData);

Die 1MB ist übertrieben, aber ich möchte nur darauf hinweisen, dass es vorzuziehen ist unnötig Kopien zu vermeiden.

Wenn ich diese Überlastung hinzufügen:

std::vector<char> GetData()
{
    std::vector<char> result;
    GetData(result);
    return result;
}

Dann, wie ist es wahrscheinlich, dass RVO wird kick?

War es hilfreich?

Lösung

Bei den meisten vernünftigerweise letzten Compiler (zum Beispiel VS 2005 oder neuer, gcc 3.4 oder höher), ist es im Wesentlichen sicher. Ich sage nur „die meisten“, weil ich nicht jeden Compiler in Existenz getestet haben. Jeder neue Compiler ich in wahrscheinlich den letzten 5 Jahren haben gesucht oder so hat es enthalten.

Andere Tipps

RVO wird höchstwahrscheinlich Tritt in, da es eine ziemlich einfache Optimierung ist, die für eine ganze Weile verfügbar ist. Um jedoch dieses Stück Code wirklich praktischen Wert zu geben, auch nur mäßig High-Performance-Code, den Sie NRVO bräuchten. NRVO ist schwieriger zu stoßen, da es relativ neu ist. Und doch ist es verfügbar. MS-Compiler, für ein Beispiel, implementiert es seit VS2005.

Ich glaube nicht, dass es irgendwelche Standard-Antwort auf diese. Sie es auf Ihrem Compiler hängt und was es fähig ist

Wenn Sie denken, dies umzusetzen für Bequemlichkeit, warum nur versuchen, nicht in auf Ihrem Compiler (n) und jeder Blick auf die Montage oder das Profil zu und sehen, was passiert? Empirische Daten über das, was Ihr Compiler tatsächlich tut, ist wahrscheinlich besser als raten, was einige Compiler kann oder auch nicht.

  

Dann, wie ist es wahrscheinlich, dass RVO wird kick?

Es ist eine Aufgabe der Software-Entwickler zu denken, nicht Compilers.

Compiler ist in der Regel optimiert, um die guten Code Arbeit gut zu machen -. Nicht schlecht

persönlich verwende ich die erste Form. Normalerweise mit einem Zeiger statt Referenz -. Die Tatsache hervorzuheben, dass der Parameter der Ausgang ist, nicht Eingang

Beachten Sie auch, dass, wenn Sie sagen:

std::vector<char> GetData() 
{ 
//   :
    return result; 
}

vector<char> x = GetData();

In den Angerufenen, result auf einen „Rückgabewert“ kopiert wird, und dann in dem Anrufer, der „Rückgabewert“ in x kopiert. NRVO kann einer dieser Kopien loszuwerden, aber nicht beides. Der Compiler ist verpflichtet, sobald die Kopie Ctor zumindest zu nennen, weil es die Kopie Ctor Nebenwirkungen zu übernehmen hat, das getan werden muss.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top