Przekazywanie struktury do funkcji.

0

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.

2

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.

0

Tak jak @twonek napisał - w C nie ma przekazania przez referencje.
Szybkość powinna być identyczna, referencja jest po prostu "bezpieczniejsza" dla nieuważnego programisty.

4

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1