• 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ść

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
452 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,060 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 Mentor (354,120 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,060 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,060 p.)
komentarz 16 sierpnia 2019 przez adrian17 Mentor (354,120 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,060 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,060 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ź 219 wizyt
pytanie zadane 1 lutego 2020 w C i C++ przez mat19 Obywatel (1,580 p.)
0 głosów
1 odpowiedź 171 wizyt
0 głosów
1 odpowiedź 425 wizyt

93,444 zapytań

142,436 odpowiedzi

322,698 komentarzy

62,806 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

...