Czym się różni przekazywanie struktury do funkcji przez wskaźnik od przekazywania przez referencję? Przeglądając projekty w internecie można spotkać dwa sposoby. Kiedy stosujemy wskaźnik a kiedy referencję? Który sposób jest szybszy.
W C nie ma przekazywania przez referencję.
W C++ używaj referencji jak możesz, bo jest wygodniejsza. "Szybkością" nie należy sobie zawracać głowy.
Tak jak @twonek napisał - w C nie ma przekazania przez referencje.
Szybkość powinna być identyczna, referencja jest po prostu "bezpieczniejsza" dla nieuważnego programisty.
W przypadku wskaźników tak jak w przypadku referencji, nowoczesny kompilator wygeneruje optymalny i szybki kod.
Jeśli stosujesz referencję:
- Trudniej doprowadzić do sytuacji gdy referencja będzie wskazywała nieprawidłowy obiekt. Referencja odnosi się do obiektu którym została zainicjowana.
- Nie możesz wskazać adresu nullptr referencją. Nie istnieje referencja ,,pusta". Zawsze jest tam obiekt.
- Dostęp do referencji uzyskujesz z użyciem identycznej składni jak do obiektu.
- Masz dostęp do referencji lewo i prawo stronnych co daje ogromne możliwości sterowania kopiowaniem i przenoszeniem
- Referencję możesz uczynić stałą co jest gwarantem że obiekt na który wskazuje referencja. nie zostanie naruszony z jej użyciem
Jeśli stosujesz wskaźnik:
- Łatwiej odwołasz się do struktur niskopoziomowych (rejestr sprzętowy)
- Łatwiej możesz rezerwować pamięć i korzystać z wywołań C-właściwych (tu zawsze można dyskutować ale generalnie łatwiej)
- Możesz stosować arytmetykę wskaźników i w ten sposób ,,nawigować" po pamięci (w ramach 1 tablicy gwarantowana poprawność wyników operacji arytmetycznych na wskaźnikach)
- Możesz posiadać wskaźnik na adres bez typu (void * .. tu na dwoje babka wróżyła czy to zaleta czy wada.. to możliwość że tak powiem :-) )
- Możesz ustawić wskaźnik na nullptr co jest sygnałem że nie wskazuje on w danym momencie na nic sensownego (nullptr stosowany jest jako ,,znacznik" kończący różne struktury)
- Możesz korzystać z konwersji tablicy na wskaźnik w miejscach gdy jest to wygodne.
- Masz gwarancję że wskaźnik do 1 elementu za tablicą jest poprawny co pozwala łatwo użyć wskaźnika jako iteratora
- Możesz różnicować stały wskaźnik, wskaźnik na stałą, stały wskaźnik na stałą, volatile stały wskaźnik itp.. Jak wiesz do czego to może służyć, docenisz :-)
To jest to co bezpośrednio przychodzi mi do głowy. Mimo że wydaje się że wskaźnik "taki fajny jest", to jest on źródłem większości problemów z zarządzaniem zasobami i bezpieczeństwem aplikacji. Domyślnie więc sugeruję operować referencją a dopiero jeśli wiesz co i po co robisz, wskaźnikiem.