• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Konstruktor przenoszący

0 głosów
1,291 wizyt
pytanie zadane 19 października 2017 w C i C++ przez Lebowski Początkujący (330 p.)
edycja 19 października 2017 przez Criss

Cześć,

Proszę Was o wyjaśnienie zachowania kompilatora przy funkcji zwracającej wartość.

Mam prostą klasę MojaKlasa posiadającą tylko "gadające" konstruktory (domyślny, kopiujący i przenoszący) oraz destruktor. Program testujący:

#include <iostream>
using namespace std;

MojaKlasa 
{
// tu gadajace konstruktory i destruktor.
};

MojaKlasa MojaFunkcja (MojaKlasa arg)
{
cout<<"w funkcji\n";
return arg;
}

int main()
{
   MojaKlasa x;
   cout<<"przed funkcja\n";
   MojaFunkcja (x);
   cout<<"po funkcji\n";
   return 0;
}

Program drukuje (zwykłym drukiem moja interpretacja):

"konstruktor domyślny" - powstaje zmienna x.

"przed funkcją"

"konstruktor kopiujacy" - w funkcji powstaje zmienna lokalna arg będąca kopią zmiennej x. Zmienna x to l-wartość więc kompilator uruchamia konstruktor kopiujący.

"w funkcji"

"konstruktor przenoszacy" - instrukcja return tworzy tu zmienną tymczasową będącą kopią zmiennej arg. Zmienna arg to l-wartość - więc dlaczego kompilator uruchamia tu konstruktor przenoszący a nie kopiujący?

"destruktor" - likwidacja zmiennej tymczasowej.

"destruktor" - likwidacja zmiennej arg.

"po funkcji"

"destruktor" - likwidacja zmiennej x.

Czy konstruktor przenoszący zostaje tu uruchomiony dlatego bo kompilator dokonuje jakiejś optymalizacji? - np. "widzi" że zmienna arg zaraz zginie więc lepiej ją "przesunąć" niż skopiować - więc zamienia ją na r-wartość (np. funkcją std::move) i uruchamia konstruktor przenoszący.

Czy dobrze to rozumiem?

Pozdrawiam,

M.

1 odpowiedź

+1 głos
odpowiedź 19 października 2017 przez adrian17 Ekspert (300,820 p.)

 w funkcji powstaje zmienna lokalna arg

Konkretniej, kopia jest wykonywana przed wywołaniem.

Czy konstruktor przenoszący zostaje tu uruchomiony dlatego bo kompilator dokonuje jakiejś optymalizacji? - np. "widzi" że zmienna arg zaraz zginie więc lepiej ją "przesunąć" niż skopiować - więc zamienia ją na r-wartość (np. funkcją std::move) i uruchamia konstruktor przenoszący

Mniej więcej tak. Patrz link: https://stackoverflow.com/a/14856553

komentarz 20 października 2017 przez obl Maniak (51,120 p.)
Dokładnie tak się dzieje.
komentarz 21 października 2017 przez Lebowski Początkujący (330 p.)
Dziękuję za pomoc :)

Podobne pytania

0 głosów
2 odpowiedzi 86 wizyt
pytanie zadane 23 lipca 2020 w C i C++ przez RufinB Początkujący (350 p.)
0 głosów
1 odpowiedź 91 wizyt
pytanie zadane 14 września w C i C++ przez Eriss69 Gaduła (4,050 p.)
0 głosów
1 odpowiedź 373 wizyt
pytanie zadane 31 marca 2019 w C i C++ przez k222 Nałogowiec (29,270 p.)
Porady nie od parady
Nie wiesz jak poprawnie zredagować pytanie lub pragniesz poznać którąś z funkcji forum? Odwiedź podstronę Pomoc (FAQ) dostępną w menu pod ikoną apteczki.FAQ

85,242 zapytań

134,056 odpowiedzi

297,246 komentarzy

56,332 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...