Frage

Ich möchte sicherstellen, dass meine Routinen wann immer möglich (N)RVO nutzen.Gibt es außer dem Parsen der resultierenden Disassemblierung etwas, das ich tun oder überprüfen kann, um zu sehen, ob eine Routine mit (N)RVO kompiliert wird?An dieser Stelle interessiere ich mich hauptsächlich für MSVC und GCC.

War es hilfreich?

Lösung

Nein nicht wirklich.

Sie können jedoch beim Schreiben Ihres Codes Richtlinien befolgen.


Unbenannte Rückgabewertoptimierung

Dies wird praktisch jedes Mal ausgelöst, wenn Sie eine temporäre Datei zurückgeben, selbst im Debug-Modus.

return MyObject(....);

Benannte Rückgabewertoptimierung

Dies wird praktisch jedes Mal ausgelöst, wenn die Funktion immer dasselbe temporäre Objekt zurückgibt:

MyObject func() {
  MyObject result;
  if (...) { return result; }

  result.push(0);
  return result;
}

Sie können diese mischen, aber in diesem Fall ist es für den Compiler nahezu unmöglich, RVO anzuwenden:

MyObject func() {
  MyObject result;
  if (...) { return MyObject(...); }

  return result;
}

Hier ist es wahrscheinlich, dass eine Rendite von RVO profitieren wird und die andere nicht.Und ich würde darauf wetten, dass das erste optimiert wird, denn wenn Sie spekulativ erstellen, stecken Sie fest result im Rückgabeschlitz und müssen plötzlich das nehmen if Zweig.Beachten Sie, dass es einfach funktioniert, die Anweisungen neu anzuordnen:

MyObject func() {
  if (...) { return MyObject(...); }

  MyObject result;

  return result;
}

Die Faustregel für NRVO lautet also, dass es keine geben sollte return Aussage zwischen der Erklärung von result und das return result; Anweisung, die etwas anderes zurückgibt als result selbst.


Wenn Sie sich daran halten, stehen die Chancen zu Ihren Gunsten.Und dann ist es nur noch eine Frage der Codeüberprüfung.

Und Sie machen Ihren Code außerdem leichter lesbar, da Sie Variablen erst dann deklarieren, wenn Sie wissen, dass Sie sie wirklich benötigen!

Andere Tipps

Sie können den Destruktor Debug-Methoden hinzufügen: generasacodicetagpre.

Wenn der Destruktor genannt wird, wurde RVO wahrscheinlich nicht angewendet.

Mögliche Möglichkeiten, wie ich denken kann:

    .
  1. Implementieren eines Referenzzählmechanismus in Ihrer Klasse, der die Anzahl der durch die Klasse erstellten Instanzen verfolgt, etwas so ziemlich ähnlich wie ein generationstechnischer WeiseCOPY ELISION ist nicht passiert.

  2. Sie können Debug-Spuren einfach in Kopierkonstruktor und Destruktor für Ihre Klasse setzen, wenn die Kopie ELISION nicht passiert, sahen Sie viele aufeinanderfolgende Kopierkonstruktor und Destruktor-Debug-Spuren.

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