Puntatori a funzione
# Puntatori a funzione

Un puntatore a funzione è un tipo di puntatore in C, C++, D, e altri linguaggi di programmazioni stile C. Quando viene dereferenziato esso invoca una funzione, passandole zero o più argomenti come ad una funzione normale. Nei linguaggi di programmazione come il C, i puntatori a funzione possono essere usati per semplificare il codice fornendo un modo semplice per eseguire codice in base a parametri determinati a run-time.

Similarmente ai puntatori a funzione esistono le funzioni oggetto o funtori, che possono essere usati in maniera simile. I funtori sono più potenti dei puntatori a funzione perché possono contenere i propri valori.

Alcuni linguaggi "puramente" ad oggetti (come java) non supportano i puntatori a funzione. Qualcosa di simile può essere implementato in questi tipi di linguaggi, sebbene, usando le reference alle interfacce questo definisce una singola funzione membro. Linguaggi Microsoft .NET come il C# e il Visual Basic .NET implementano dei puntatori a funzione type safe con i delegate.

In altri linguaggi che supportano le funzioni first-class, le funzioni sono trattate come dati e possono essere passate, ritornate e create dinamicamente da altre funzioni, eliminando la necessità di puntatori a funzione.

L'uso eccessivo di puntatori a funzione può produrre un rallentamento del codice sui processori moderni, perché la branch prediction può non essere in grado di prevedere quale ramo verrà preso (dipende infatti dal valore del puntatore a funzione a run-time), sebbene questo effetto possa essere compensato per ridurre le ricerche nelle tabelle di lookup.

## Puntatori a metodo

Il C++ è object-oriented, quindi le classi possono avere metodi. Funzioni membro non-statiche (metodi di istanza) hanno un parametro implicito (il puntatore a this) che è il puntatore all'oggetto su cui sta operando, quindi il tipo dell'oggetto deve essere incluso come parte del tipo del puntatore a funzione. Il metodo viene poi utilizzato su un oggetto di quella classe usando uno degli operatori "puntatori a membro": .* o ->* (per un oggetto o un puntatore ad oggetto rispettivamente).

Sebbene i puntatori a funzione in C e C++ possano essere implementati come semplici indirizzi, per cui tipicamente sizeof(Fx)==sizeof(void *), i puntatori a membro in C++ sono spesso implementati come fat pointer, tipicamente due o tre volte la dimensione del puntatore a funzione, in accordo con la ereditarietà virtuale (si vedano anche le funzioni virtuali).

