• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Ilość przeciążeń a efektywność

Object Storage Arubacloud
0 głosów
258 wizyt
pytanie zadane 16 sierpnia 2019 w C i C++ przez enigmatycznyclay Bywalec (2,450 p.)
zamknięte 17 sierpnia 2019 przez enigmatycznyclay
Czy ilość przeciążeń danej funkcji czy operatora wpływa na jego szybkość wywołania?
komentarz zamknięcia: Rozwiązane

1 odpowiedź

0 głosów
odpowiedź 16 sierpnia 2019 przez tkz Nałogowiec (42,000 p.)
wybrane 17 sierpnia 2019 przez enigmatycznyclay
 
Najlepsza

Co do funkcji kompilator widzi różne funkcję. 

#include <iostream>

// Volume of a cube.
int Volume(int s) {
  return s * s * s;
}

// Volume of a cylinder.
double Volume(double r, int h) {
  return 3.1415926 * r * r * static_cast<double>(h);
}

// Volume of a cuboid.
long Volume(long l, int b, int h) {
  return l * b * h;
}

int main() {
  std::cout << Volume(10);
  std::cout << Volume(2.5, 8);
  std::cout << Volume(100l, 75, 15);
}
https://en.wikipedia.org/wiki/Function_overloading

W tym przypadku 3 różne. Więc nie masz utraty wydajności przez przeciążenie. Możesz pocztać o Name mangling, albo po Polsku jest to chyba ozdabianie nazw. 

Tutaj po prostu skopiuje wpis z Stacka(https://stackoverflow.com/questions/4421706/what-are-the-basic-rules-and-idioms-for-operator-overloading). Ogólnie operatory narzucają jakiś koszt, tak bardzo ogólnie. 

komentarz 16 sierpnia 2019 przez adrian17 Ekspert (344,860 p.)

Ogólnie operatory narzucają jakiś koszt, tak bardzo ogólnie. 

Taki sam, jak zwykłe wywołanie funkcji - potencjalnie zerowy.

(można by się najwyżej czepiać gdyby ktoś mikrooptymalizował na poziomie np kolejności przekazywanych argumentów lub czegoś podobnego, ale to zupełnie inny temat)

komentarz 16 sierpnia 2019 przez tkz Nałogowiec (42,000 p.)

There will be a large difference between:

Complex a(1.0, 2.0), b(1.1, 2.2);
Complex c;

c = a + b;

and:

Complex a(1.0, 2.0), b(1.1, 2.2);
Complex c;

c.re = a.re + b.re;
c.im = a.im + b.im;

if the Complex operator+(Complex lhs, Complex rhs); function is not possible to inline. However, if the compile can inline the code, there would be no difference at all.

Wszystko zależy od implementacji. Przeciążona funkcja nie daje strat. Bo to nadal zwykła funkcja. Zaś z operatorem działa to inaczej. 

komentarz 16 sierpnia 2019 przez tkz Nałogowiec (42,000 p.)
komentarz 16 sierpnia 2019 przez adrian17 Ekspert (344,860 p.)
edycja 16 sierpnia 2019 przez adrian17

if the compile can inline the code, there would be no difference at all.

i to dokładnie dzieje się tutaj.

Twój kod daje takie same czasy dla wszystkich trzech pętli (pozornie pierwsza jest wolniejsza, ale jak dodasz iterację "rozgrzewającą" lub zmienisz kolejność testów to zobaczysz że po prostu zawsze pierwszy wykonywany test jest wolniejszy), ba, gorąca pętla dodająca we wszystkich trzech przypadkach kompiluje się do tego samego - po dwa movsd, addsd, movsd.

https://godbolt.org/z/K_I-VA

Przeciążona funkcja nie daje strat. Bo to nadal zwykła funkcja. Zaś z operatorem działa to inaczej. 

Operator to wciąż zwykła funkcja.

a[i] = b[i] + c[i];

to tylko cukier składniowy na

a[i] = operator+(b[i], c[i]);

 

komentarz 16 sierpnia 2019 przez tkz Nałogowiec (42,000 p.)
Muszę o tym doczytać. ale faktycznie możesz mieć racje. Kod sprawdziłem, masz rację.
komentarz 16 sierpnia 2019 przez tkz Nałogowiec (42,000 p.)
Faktycznie miałeś racje, kod wygenerowany w assemblerze niczym się nie różni. Przeciążenie operatora nie ma wpływu na wydajność.

Podobne pytania

0 głosów
1 odpowiedź 182 wizyt
pytanie zadane 1 lutego 2020 w C i C++ przez mat19 Obywatel (1,580 p.)
0 głosów
1 odpowiedź 210 wizyt
0 głosów
1 odpowiedź 454 wizyt

92,565 zapytań

141,416 odpowiedzi

319,596 komentarzy

61,948 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...