PSk*_*cik 6 c function-pointers callback language-lawyer
这或多或少是一个关于使用示例代码将函数指针转换为另一个类型的澄清请求
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);
}
Run Code Online (Sandbox Code Playgroud)
答案说一个"好"的编译器应该能够优化my_callback_helper()函数,但是我发现在https://gcc.godbolt.org
上没有编译器来执行它并且辅助函数总是生成,即使它只是跳转到my_callback_function()( - O3):
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
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:标准中是否有任何东西阻止编译器消除帮助?
标准中没有任何内容可以直接阻止这种优化。但实际上,当编译器没有“全貌”时,他们并不总是可能做到这一点。
您已获取 的地址my_callback_helper。因此编译器无法轻易优化它,因为它不知道do_stuff它会做什么。在定义的单独模块中do_stuff,编译器不知道它可以简单地使用/调用my_callback_function来代替其参数(my_callback_helper)。为了my_callback_helper完全优化,编译器还必须知道它的do_stuff作用。但是do_stuff是一个外部函数,其定义对编译器不可用。do_stuff因此,如果您提供其定义及其所有用途,则可能会发生这种优化。