Wpis z mikrobloga

#gamedev #programista15k #programowanie #cpp #c czołem, czy w C da się wywołać procedurę podając np. Tylko jej adres. Chodzi o optymalizację warunków IF lub switch, zamiast sprawdzać zmienna, wrzucić do tablicy adresy funkcji, odpowiednia funkcja by się wywoływała bez konieczności sprawdzania po prostu adres wg indexu tablicy. Pytanie czy można to zrobić w samym C niezależnie od platformy, bo np. Winapi moze miec swoje pomocnicze funkcje
  • 8
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Kopytko1: tak, możesz tak zrobić, ale kompilator ogarnia takie rzeczy sam. https://gcc.godbolt.org/z/bsPz4M w tym przykładzie można zobaczyć jak kompilator podszedł do wygenerowania kodu na trzy różne sposoby:

* dla 4 przypadków sprawdza wszystko po kolei
* dla 5 robi coś ala binary search (.L21)
* dla 10 jest tabelka o której wspomniałeś

Inna sprawa, że programy raczej nie są wolne, bo wybór odpowiedniej funkcji trwa długo. To raczej mikro optymalizacja,
  • Odpowiedz
@Kopytko1: chyba nie skumałem pytania ale jak chcesz inaczej wywołać funkcje niż podając jej adres? Używasz nazwy funkcj a kompilator to resolvuje do adresu w czasie linkowania
  • Odpowiedz
@haxx: tak o to chodzilo, juz zdazylem to wyszukac na stacku, dzieki.. Pozostaje pytanie czy przyniesie to jakas optymalizacje, gdy mamy np. Swtcha z 6 opcjami ktory wykonuje sie co kazda klatke tj. 60 razy na sek. Niekomiecznie kazdy kompilator musi to ogarnac zwlaezcza jesli mowimy np. O jakims gcc w wwersji 8 itp.
  • Odpowiedz
@Kopytko1: 6 * 60 to jest nic, naprawdę. Głupie powiększenie std::vectora z 500 elementów do 1000 będzie trwało dużo dłużej z uwagi na koniecznosć zaalokowania nowej pamięci i skopiowania całej zawartości ze starego do nowego. Jak chcesz znaleźć hot spoty to użyj profilera (np. perf na linuxie, nie wiem czego używa się na windowsie). Jeśli nie robiłeś tego jeszcze w swoim kodzie, to gwarantuję ci, że znajdziesz coś i to
  • Odpowiedz
@Kopytko1: Już ładnie ktoś powyżej napisal, że to wszystko robi kompilator.
Ja tylko dodam taką rzecz: jeśli wsadziłbyś te wskaźniki na funkcje do struct, to miałbyś klasy.
Te funkcje przyjmowałyby jako pierwszy parametr egzemplarz (instancję) takiego właśnie structa, jawnie bądź niejawnie, i dla przejrzystości nazwalibyśmy go np. "this", albo "self".
I wtedy kiedy takich obiektów typu tego structa natworzysz miliony, to nadal masz jedną funkcję, z właściwym jej, stałym adresem (możesz go np.
  • Odpowiedz