Frage Gibt es eine Möglichkeit zu überprüfen, ob RVO angewendet wurde?


Ich hatte diese ganze Geschichte über meine frustrierende Reise, um herauszufinden, dass eine ungeordnete Karte, die ich von einer Funktion zurückgab, tatsächlich nicht veröffentlicht wurde, obwohl ich sicher war, dass es zu einem früheren Zeitpunkt war, dass es nur irrelevant war.

Gibt es eine Möglichkeit zu überprüfen, ob RVO in einer bestimmten Funktion auftritt? Oder wie eine Liste von Do's and Dont's zu folgen, um das gewünschte Ergebnis zu bekommen?


5
2018-03-02 00:59


Ursprung


Antworten:


Ja. Erstellen Sie Hooks für die Lebenszyklusmethoden Ihrer Klasse:

#include <iostream>

struct A{
  A() 
    { std::cout<<"Ctor\n"; } 
  A(const A& o) 
    { std::cout<<"CCtor\n"; } 
  A(A&& o) 
    { std::cout<<"MCtor\n"; } 
  ~A() 
    { std::cout<<"Dtor\n"; } 
private:
  int vl_;
};

A getA(){
  A a;
  return a;
}

int main(){
  A b = getA();
  return 0;
}

Jetzt mit RVO ist b das gleiche Objekt wie a im getA so wirst du nur sehen

Ctor
Dtor 

Sie können RVO unterdrücken, indem Sie beispielsweise einen zusätzlichen Rückkehrpunkt hinzufügen:

 return a;
 return A{a};

oder umziehen:

return std::move(a);

Und dann wirst du sehen:

Ctor
Mctor
Dtor
Dtor 

3
2018-03-02 01:13



Sie können überprüfen, ob RVO an allen Orten verwendet wurde, an denen es für Sie wichtig ist:

template<typename T>
struct force_rvo: T {
    force_rvo() {}
    using T::T;
    force_rvo(const force_rvo &);
    force_rvo(force_rvo &&);
};

force_rvo<std::map<int, int>> f() {
    force_rvo<std::map<int, int>> m;
    m[17] = 42;
    return m;
}

int main() {
    auto m = f();
    return m[42];
}

Das force_rvo Typ gibt vor, kopierbar und beweglich zu sein, andernfalls würde der Compiler ablehnen return m. Aber wenn einer von diesen tatsächlich verwendet wird, wird Linker fehlschlagen und Ihnen sagen, wo genau das passiert ist. Der Wrapper kostet keine Kosten, erfordert aber die Verwendung sowohl auf Seiten des Aufrufers als auch der Implementierung, was möglicherweise nicht sehr praktisch ist.


2
2018-03-02 02:28