Brak konstruktora kopiującego

0

Cześć

Mam problem z wywołaniem konstruktora kopiującego, a raczej z wątpliwościami, czy to na pewno on powinien być wywoływany.
Pod linkiem:
http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=199
W sekcji Return Value Optimization jest kawałek kodu:

 string getmagicword()
(
return string("Supercalifragilisticexpialidocious");
);
string magicw=getmagicword();

..i piszą, że jest wywoływany konstruktor kopiujący dla magicw.

Mam niemal identyczny przykład "u siebie":

#include <iostream>
using namespace std;

class X{
public:
    X(){
        cout << "Konstruktor domyslny" << endl;
    }

    X(const X& x){
        cout << "Konstruktor kopiujacy X::X(const X& x)" << endl;
    }
    
    X(X&& x){
        cout << "Konstruktor przenoszacy X::X(X&& x)" << endl;
    }

    ~X(){
        cout << "Destruktor X::~X()" << endl;
    }
};

void f(X x){}

X g()
{
    X x;
    return x;
}

int main(){
    cout << "Zwrocenie przez wartosc: " << endl;
    X x2 = g();
} 

I output:

Zwrocenie przez wartosc: 
Konstruktor domyslny
Destruktor X::~X() 

Moje pytanie brzmi: czemu nie wywołuje się konstruktor kopiujący, jeśli w podobnym przykładzie zaznaczyli, że powinien?
Jeśli nie wywołuje się k. kopiujący, to co w takim razie tam ma miejsce?

Dzięki z góry!

0

No ale przeczytaj dalej: na tym właśnie polega RVO, że obiekt może być skonstruowany w docelowym miejscu (czyli na zewnątrz funkcji) zamiast lokalnie a następnie skopiowany.

0

RVO to technika optymalizacyjna, która pozwala pominąć kopiowanie zwracanego obiektu na rzecz konstruowania obiektu bezpośrednio w pamięci przydzielonej dla wartości zwracanej z funkcji.
Generalnie rzecz ujmując RVO działa, gdy spełnione są następujące warunki:

  1. Typ zwracanego obiektu jest taki sam jak typ zwracany przez funkcję
  2. Zwracany obiekt jest lokalny (r-value lub l-value)

Warto dodać, że jeśli warunki do zadziałania RVO są spełnione ale kompilator z jakiś przyczyn nie zastosuje copy elision (np. funkcja ma wiele ścieżek wykonania, z których może zwrócić różne zmienne lokalne, co może spowodować problem dla kompilatora do zastosowania RVO) to i tak standard wymusza żeby zwracany obiekt musiał być traktowany jako r-value.

1 użytkowników online, w tym zalogowanych: 0, gości: 1