• 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,299 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 (302,720 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 94 wizyt
pytanie zadane 23 lipca 2020 w C i C++ przez RufinB Początkujący (350 p.)
0 głosów
1 odpowiedź 105 wizyt
pytanie zadane 14 września w C i C++ przez Eriss69 Gaduła (4,050 p.)
0 głosów
1 odpowiedź 394 wizyt
pytanie zadane 31 marca 2019 w C i C++ przez k222 Nałogowiec (29,590 p.)

85,802 zapytań

134,588 odpowiedzi

298,788 komentarzy

56,697 pasjonatów

Advent of Code 2021

Top 15 użytkowników

  1. 494p. - rucin93
  2. 482p. - CC PL
  3. 463p. - nidomika
  4. 385p. - Whistleroosh
  5. 379p. - ScriptyChris
  6. 372p. - adrian17
  7. 340p. - TheLukaszNs
  8. 339p. - WhiskeyTaster
  9. 321p. - Argeento
  10. 318p. - Dagohar
  11. 287p. - Anonim 1794483
  12. 281p. - Klaudia
  13. 278p. - B4mbus
  14. 269p. - b0mbix
  15. 246p. - tokox
Szczegóły i pełne wyniki

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.

...