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

question-closed Funkcje zwracające referencje - tak na krótko

Object Storage Arubacloud
0 głosów
150 wizyt
pytanie zadane 2 marca 2018 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
zamknięte 2 marca 2018 przez Jakub 0

TEMAT DO ZAMKNIĘCIA NIEBAWEM - ZANIM ODPOWIESZ NA PYTANIE ZOBACZ NA KOMENTARZE:

Witam, zaznaczę że ogólnie rozumiem funkcje zwracające alias (referencję) i ich zastosowanie. Tu mam jednak pytanie dotyczące bardziej wewnętrznej strony...

Mamy taką funkcje:

int f(int a);

Zwraca ona np. zmienną 'a' jej przekazaną.

Oraz taką:

int& f2(int& a);

Robi to samo ale zwraca referencję na a. Jednym z wielu korzyści i konsekwencji użycia funkcji f2() jest to że działa ona szybciej od f() (niezauważalnie oczywiście dla człowieka).

Tzn funkcja f() zwraca 'a' czyli umieszcza tą wartość w rejestrze (kopiuje ją) a to zabiera czas.

Potem gdy napiszemy:

int a = 8;
int x = f(a);

To wartość z rejestru jest dodatkowo kopiowana do zmiennej x.

W tym przypadku natomiast:

int a = 8;
int x = f2(a);

Wykona się to szybciej bo kopiujemy to co zwraca funkcja f2() bezpośrednio do zmiennej 'x', czyli wcześniej nie kopiuje zwracanej wartości do rejestru co kosztuje czas.  ( f2() to jakby w tym momencie alias dla 'a'). Tak pisze w książce z której się uczę (to dałem inny prostszy przykład banalnych funkcji by pokazać o co mi chodzi). Tu jest coś dla mnie niejasnego... Jak to możliwe że funkcja zwracająca wartość (alias to chyba też jakaś wartość) nie umieszcza jej w rejestrze? Myślałem że te zasady tyczą się wszystkich funkcji. Kiedy funkcja zwraca referencję to jak jest wewnętrzne obsługiwana zwracana wartość?

A co w przypadku funkcji zwracających wskaźnik? Czy też zyskujemy coś na czasie? Wiem oczywiście że zyskujemy w przypadku zwracania dużych struktur, jest szybciej kiedy zwracamy wskaźnik lub referencję na nie. Mi jednak chodzi o zwykłe zmienne.

Dziękuje serdecznie za pomoc w zrozumieniu tego ;)

komentarz zamknięcia: już wiem
komentarz 2 marca 2018 przez Jakub 0 Pasjonat (23,120 p.)
edycja 2 marca 2018 przez Jakub 0

Chyba sam zrozumiałem temat, nie zamykam jeszcze pytania gdyby ktoś chciał poprawić mój tok myślenia:

Stosowanie funkcji zwracającej referencje lub wskaźnik przyśpiesza czas tylko w przypadku dużych typów złożonych takich jak obiekty. Np, funkcja zwracająca obiekt jakiejś struktury, załóżmy że ma ona 10 pól. Kiedy funkcja zwraca taki obiekt to wszystkie pola są kolejno kopiowane do tymczasowego bloku pamięci (np rejestru). Kiedy zwracamy referencje lub wskaźnik na ten obiekt to w bloku pamięci znajduje się sam adres tego obiektu. (bo referencja to tak naprawdę twór zbliżony do wskaźnika zawierający adres, a dokładniej to ma taki sam adres jak zmienna/obiekt którego jest aliasem - jest jego alternatywną nazwą ). Takie coś oszczędza czas i pamięć w przypadku dużych typów złożonych (obiektów), jednak kiedy zwracamy zwykłą zmienną to nie ma to zbyt wielkiego znaczenia. (poza innymi skutkami zwracania referencji).

 

Był bym wdzięczny za zweryfikowanie mojego zrozumienia frown

1
komentarz 2 marca 2018 przez j23 Mędrzec (194,920 p.)

Dobrze rozumiesz. Choć zwracanie przez wartość może być zoptymalizowane przez kompilator tak, że będzie równie szybkie co zwracanie przez referencję/wskaźnik -> RVO

Podobne pytania

0 głosów
3 odpowiedzi 197 wizyt
pytanie zadane 17 października 2016 w C i C++ przez niezalogowany
0 głosów
2 odpowiedzi 281 wizyt
pytanie zadane 4 czerwca 2016 w C i C++ przez chacken Użytkownik (820 p.)
0 głosów
4 odpowiedzi 835 wizyt
pytanie zadane 15 października 2017 w C i C++ przez Corvette 653 Początkujący (400 p.)

92,631 zapytań

141,498 odpowiedzi

319,872 komentarzy

62,011 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!

...