Modyfikator const

Modyfikator const
Michalcpp944
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:18
0

Sytuacja C++

czy const &a == a?

Dziękuję za odpowiedz.

edytowany 1x, ostatnio: Michalcpp944
pingwindyktator
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Kraków
  • Postów:1055
1

Co to znaczy?
1)

Kopiuj
int a = 0;
const int &ra = a;
a == ra;
Kopiuj
int a = 0;
const int &ra = a;
typ(a) == typ(ra);

O którą z wersji Ci chodzi?


do not code, write prose
Michalcpp944
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:18
0

Przekazuje jako argument do funkcji dajmy na to funkcja zwie się f():

f(int a);
f(const int &a);

Moje pytanie brzmi: czy w tym przypadku istnieje różnica miedzy przekazaniem wartości do funkcji a przekazaniem stałej referencji... Jaka jest różnica?

Ps. Dla wskaźników rozumiem idee zapisu typu f(const int *a), tutaj mam stałą wartosc jednak możliwość zmiany adresu pod a, ma to jakiś sens ale dla referencji średnio rozumiem zapis (const int &a). Dziękuję za odpowiedz.

pingwindyktator
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Kraków
  • Postów:1055
2

Referencja jest abstrakcją na wskaźniki, jakby aliasem na nazwę obiektu. Przekazując parametr jako const int &a widzisz oryginalny obiekt, ale nie mozesz go modyfikowac. Przekazujac natomiast jako int, w funkcji dostajesz skopiowany obiekt.
Konkretnie dla int i innych małych (w sensie zajętości pamięci) obiektów nie ma sensu robić tego przez const &.


do not code, write prose
NO
  • Rejestracja:około 9 lat
  • Ostatnio:prawie 6 lat
  • Lokalizacja:Warszawa
  • Postów:21
0

a nie jest tak, że jak przesyłamy stałą referencję, to program wykona się trochę szybciej, bo nie zostanie uruchomiony konstruktor kopiujący?

pingwindyktator
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Kraków
  • Postów:1055
1

Nie. Tak jak napisałem, kopiowanie małych obiektów (jak int) jest równie efektywne.


do not code, write prose
edytowany 4x, ostatnio: pingwindyktator
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:Szczecin
2

Nie do końca. Przekazywanie przez kopię jest wydajniejsze dla małych obiektów - kompilator ma pewność, że wywołana funkcja nie skorzysta z const_cast więc może nie wczytywać wielokrotnie tej samej zmiennej i zastosować inne optymalizacje. Polecam wykłady Chandlera Carrutha na ten temat. (to chyba ten: )

Przykład wygenerowanego innego kodu: https://godbolt.org/g/sYdtLF


edytowany 3x, ostatnio: kq
Michalcpp944
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:18
0

Dziękuję za odpowiedz. Myślę ze na poziomie abstrakcji na jakim jestem te odpowiedzi mi wystarczają, doczytam na temat const_cast. Dzięki

twonek
ze szczególnym uwzględnieniem dlaczego powinieneś go unikać

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.