を最適化する。これは、サンプルコードと Casting a function pointer to another typeヘルパー関数
struct my_struct;
void my_callback_function(struct my_struct* arg);
void do_stuff(void (*cb)(void*));
static void my_callback_helper(void* pv)
{
my_callback_function(pv);
}
int main()
{
do_stuff(&my_callback_helper);
}
の明確化のため、多かれ少なかれ要求である答えは「良い」、コンパイラが にmy_callback_helper()
機能を最適化することができるはずと言うが、私が見つかりました。それとヘルパー関数は、常にそれがjust a jump to my_callback_function()
(-O3)だ場合でも生成されますんhttps://gcc.godbolt.org でコンパイラなかっなし:
my_callback_helper:
jmp my_callback_function
main:
subq $8, %rsp
movl $my_callback_helper, %edi
call do_stuff
xorl %eax, %eax
addq $8, %rsp
ret
だから私の質問です:コンパイラがヘルパーを削除するのを防ぐ標準の中に何かがありますか?
コンパイラは、関数ポインタの値をコンパイル時に決定できたとしても、関数ポインタ呼び出しをインライン展開するのに苦労する傾向があります。あなたは 'inline'キーワードで投げようとすることができます。私が知る限り、標準には最適化を妨げるものは何もありません。 – Lundin