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

Konstruktor przenoszący

Object Storage Arubacloud
0 głosów
1,368 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 (344,860 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,280 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 179 wizyt
pytanie zadane 23 lipca 2020 w C i C++ przez RufinB Obywatel (1,830 p.)
0 głosów
1 odpowiedź 641 wizyt
pytanie zadane 14 września 2021 w C i C++ przez Eriss69 Gaduła (4,470 p.)
0 głosów
1 odpowiedź 826 wizyt
pytanie zadane 31 marca 2019 w C i C++ przez k222 Nałogowiec (30,150 p.)

92,555 zapytań

141,403 odpowiedzi

319,560 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...