Wpis z mikrobloga

@achr: Odpowiedź dla przeciążonych operatorów nie ma sensu, bo to zależy w całości od programisty, a nie języka.

Tak naprawdę przeciążenie operatora skutkuje tym, że nie można już tego nazywać operatorem – to jest najzwyklejsza funkcja, którą też wprost można wywołać. Nic nie stoi na przeszkodzie, żeby ++obiekt robił sortowanie jakiejś tablicy, a obiekt++ wysyłał dane po TCP/IP. ( ͡° ͜ʖ ͡°)
  • Odpowiedz
@htfhere: Z tego co wiem to preimplementacja jest bardziej wydajna. Bo jak masz np. i++ to jest to funkcja która wygląda mniej więcej tak:
temp=i;
i=i+1;
return temp;
a ++i wygląda
  • Odpowiedz
@Rincewind: Operator postinkrementacji zwraca kopię. W przypadku typów podstawowych, jeśli kompilator nie zoptymalizuje tego, dostaniesz narzut z tym związany.
  • Odpowiedz
@achr: Pre- i postinkrementacja jest operatorem tylko dla typów podstawowych, dla wszystkich pozostałych to po prostu funkcja. Nie jest wcale powiedziane co ma robić, nie jest nawet wymagane, by zwracała cokolwiek: http://ideone.com/qo0izZ

Ale OK, zapędziłem się trochę. Sama teoretyczna operacja preinkrementacji i postinkrementacji jest jasno zdefiniowana, i zgodnie z definicją postinkrementacja zwraca poprzednią wartość. Więc w zasadzie masz rację. :)
  • Odpowiedz
@Analityk: Ale ja o czymś innym mówię. Zgadzam się, że wbudowana operacja pre/post-in/dekrementacji jest optymalizowana przez kompilator i nie ma żadnej praktycznej różnicy w czasie wykonania. Ale z drugiej strony zgadzam się z @achr, bo dla typów złożonych operacje te, tak aby zgadzały się z definicją, muszą być różnie implementowane. W szczególności: post musi zwrócić wartość sprzed wykonania operacji, co wiąże się ze stworzeniem kopii.

Jeszcze inna sprawa
  • Odpowiedz
W 99% przypadków (kiedy x++ / ++x występuje samo w linii, albo jako trzeci człon pętli for) nie ma to najmniejszego znaczenia. Jeśli Twój kompilator produkuje inny kod w tych przypadkach, zgłoś buga.

Jeśli x++ / ++x występuje jako część większego wyrażenia to albo nie ma to znaczenia (przykład niżej) albo różnica w semantyce sprawia że i tak nie zrobisz tego szybciej.

Przykład dla którego x++ i ++x są tak samo wydajne (mimo że dają inny wynik),
dla volatile int x = 0, y = 0; kompilator MSVC:
  • Odpowiedz
W szczególności: post musi zwrócić wartość sprzed wykonania operacji, co wiąże się ze stworzeniem kopii.


@Rincewind: Mógłbyś wskazać konkretną okoliczność? Bo nie rozumiem kiedy to się zdarza.
  • Odpowiedz