Kiedy stosuje się wskaźniki na funkcje?

0

Witam!
Nurtuje mnie jedno pytanie. Kiedy stosuje się wskaźniki na funkcje, i po co to jest??

Przecież znacznie wygodniejsze jest wywołanie funkcje poprzez jej nazwę, poco bawić się we wskaźniki??
wiem że operacje na wskaźnikach znacznie szybsze, więc w dużych projektach może się tak wywołuje funkcje

proszę o odpowiedź.

4

Dwa podstawowe zastosowania:

  1. Przekazania wskaźnika do innej funkcji, np do: std::sort
  2. Tworzenie tablic/map/list gdzie element zawiera wskaźnik na odpowiednią funkcje np:
double add(double a,double b) { return a+b; }
double sub(double a,double b) { return a-b; }
double mul(double a,double b) { return a*b; }
double div(double a,double b) { return a/b; }
typedef FUN(double a,double b);
struct _OPR_ { char operation; FUN *fun; } Tb[]=
  {
     {'+',&add},
     {'-',&sub},
     {'*',&mul},
     {'/',&div},
  };
1

A co jeśli chcesz napisać funkcje która wywołuje zadaną funkcje? Napisz mi proszę funkcję sortującą która porównuje obiekty przez wybrany przez użytkownika sposób. Tzn chce żeby miała ona dwa parametry: listę obiektów do sortowania i funkcje porównującą obiekty.

2

Operacje na wskaźnikach nie są szybsze. Musisz sprawdzić wartość wskaźnika, a potem dopiero możesz wykonać działanie na podstawie uzyskanej wartości. Rozwala to cache.

Wskaźniki do funkcji używa się wtedy, gdy nie możesz z góry założyć jakie działanie ma zostać wykonane, czyli nie znasz nazwy funkcji. Np callbacki w różnych API lub handlery komunikatów.

1

Najprościej rzecz ujmując czasami do funkcji trzeba przekazać nie dane, ale jakieś zachowanie: np jak porównywać jakieś dane (przy sortowaniu), jak powiadomić o jakimś wydarzeniu. oraz wiele wiele innych możliwości.

0

Operacje na wskaźnikach nie są szybsze. Musisz sprawdzić wartość wskaźnika, a potem dopiero możesz wykonać działanie na podstawie uzyskanej wartości. Rozwala to cache.

Jakie cache?

Przewidywanie skoków we współczesnych CPU działa także na wskaźnikach do funkcji, więc o ile nie masz tych niebezpośrednich wywołań zbyt dużo to procesor sam sobie z nimi po części poradzi (w sensie przewidzi tak jak inne skoki i dzięki temu będzie pracował wydajnie). Jeśli miejsc z niebezpośrednimi wywołaniami będzie dużo to przepełnisz bufor predykcji i będzie klops. Ale np przy jednym wskaźniku nie powinno być dużego problemu.

Większym problemem jest to, że dynamiczne skoki utrudniają lub uniemożliwiają silną optymalizację podczas kompilacji. Dlatego w C++ stosuje się szablony, które są niczym innym jak generatorami kodu, który też podlega optymalizacji. Nawiązując do pytania Shaloma: można zrobić funkcję szablonową która przyjmuje funkcję jako parametr szablonu oraz kolekcję jako parametr funkcji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1