2011-09-04 12 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()); 
} 

gccでは、生成されたasmファイルはインラインでもインラインでも同じです。関数ポインタを持つコードと同じですか?関数ポインタで使用される関数をインライン化できますか?

+1

gccを含むほとんどのコンパイラは、インラインであるかどうかを判断する際に、実際には 'inline'を気にしません。それは間違いなく無視することができ、インラインの存在がそれを決定するヒューリスティックに多くの影響を与えた場合、私は驚くだろう。 – delnan

答えて

6

関数ポインタは、その値がコンパイル時に完全に決定可能でない限り、インライン化できません。あなたのケースは決定できません。

ほとんどの場合、関数ポインタが関数ポインタ内にあることをコンパイラが認識できる場合でも、関数ポインタは決してインライン化されません。

+1

私はこれにほとんど同意します。しかし、ここで '' if(rand%2){/ * for f0 * /} else {/ * code for f1 * /} '')に' 'f0'と' f1' *をインライン化することができます。しかし、私はどのコンパイラもこの種のものを発見するヒューリスティックを持つだろうとは思っていません。 –