2011-09-04 15 views
6
#include <stdlib.h> 

inline int f0(int a) { 
    return a*a; 
} 

inline int f1(int a) { 
    return a*a*a; 
} 

int main() { 
    int (*f)(int); 
    f = rand()%2 ? f0 : f1; 
    return f(rand()); 
} 

Quindi con gcc, il file asm generato è lo stesso con o senza in linea. È lo stesso con qualsiasi codice con i puntatori di funzione?Le funzioni utilizzate tramite i puntatori di funzione possono essere allineate?

+1

Si noti che la maggior parte dei compilatori, incluso gcc, non si preoccupano del proprio 'inline' quando decidono se inline qualcosa. Sicuramente posso ignorarlo e sarei sorpreso se la presenza di 'inline' avesse una grande influenza sull'euristica che lo decide. – delnan

risposta

6

I puntatori di funzione non possono essere in linea a meno che il loro valore sia completamente decidibile in fase di compilazione. Il tuo caso non è decidibile.

La maggior parte delle volte i puntatori di funzione non saranno mai allineati, anche se il compilatore può vedere quale funzione si trova nel puntatore della funzione.

+1

Sono d'accordo con la maggior parte di questo. Tuttavia, 'f0' e' f1' * potrebbero * essere inline qui ('if (rand% 2) {/ * codice per f0 * /} else {/ * code per f1 * /}'). Ma dubito che qualsiasi compilatore avrebbe un'euristica per individuare questo tipo di cose. –

Problemi correlati