Wpis z mikrobloga

#cpp
Bardziej opłaca się przekazywać obiekty przez wskaźniki czy przez referencje?
Rozumiem, że główny problem polega na tym, że jak przekazujemy przez wskaźnik, to trzeba pamiętać o zwalnianiu pamięci?
  • 14
@VanQator: no referencje chyba bezpieczniejsze są, dlatego nowoczesne języki często przekazują przez referencje by default

jak nie potrzebujesz wskaźników to nie używaj

ale w C++ zwolnić pamięć musisz tak czy siak chyba, tak mi się wydaje przynajmniej, bo tam raczej żadnego GC nie ma

ale mogę sie mylić, w Cpp się nie bawiłem już ponad 10 lat
@VanQator: Zwalnianie pamięci dotyczy tylko obiektów alokowanych na stercie. Po de referencji wskaźnika można taki obiekt dalej przekazywać jako referencje. Do obiektów alokowanych na stosie też da się pobrać wskaźnik, ale trzeba pamiętać, że jest on ważny tylko do czasu trwania scopa, w którym został on za alokowany. No i też łatwiej się pomylić, bo zwolnienie wskaźnika na obiekt na stosie się niepowiedzie ( ͡° ͜ʖ ͡°)
@VanQator: wskaznik i referencja to tylko syntax, w kodzie maszynowym dostaniesz dokladnie to samo. Referencje sa po prostu bezpieczniejsze w uzyciu, ale wielu programistow nie lubi ich uzywac, poniewaz wskazniki sa czytelniejsze przy wywolywaniu funkcji (pass by ref nie odroznisz od pass by val bez interfejsu).
Wskaznik moze rownie dobrze wskazywac na stack, a nie na heap, nie trzeba pamietac o zadnym zwalnianiu pamieci.

W praktyce zawsze jak uzywasz alokacji pamieci,
@lionbest: A np. jak stworzyłem konstruktor kopiujący, który przyjmuje w parametrze wskaźnik na obiekt zamiast referencji, to generalnie mogą wystąpić z tego jakieś problemy, czy to raczej równoważne rozwiązania?
@VanQator: w takim przykladzie

void foo(int& x);

int main() {
int* x = new int;
foo(*x)

}

przekazuję przez referencję, jednak problem dalej zostaje. Nie ważne jest czy używasz wskaznika czy referencji, tylko przypadek użycia. Czy w danym przypadku wskaznik jest używany jako właściciel (czyli powinien zawołać delete) czy jak obserwator (nic nie zwalnia tylko czyta). W c++ jest taka konwencja, że raczej przekazuje się przez referencje, jeżeli twój przypadek użycia
@VanQator: Pod względem wydajności nie ma znaczenia (w kodzie maszynowym i tak jest to samo), pod względem wygody myślę że referencja/alias > wskaźnik (poza tym chodzo ploty z że od C++23 mają wywalić raw pointery).