优化辅助函数

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)

所以我的问题是:标准中是否有任何东西阻止编译器消除帮助?

P.P*_*.P. 3

标准中没有任何内容可以直接阻止这种优化。但实际上,当编译器没有“全貌”时,他们并不总是可能做到这一点。

您已获取 的地址my_callback_helper。因此编译器无法轻易优化它,因为它不知道do_stuff它会做什么。在定义的单独模块中do_stuff,编译器不知道它可以简单地使用/调用my_callback_function来代替其参数(my_callback_helper)。为了my_callback_helper完全优化,编译器还必须知道它的do_stuff作用。但是do_stuff是一个外部函数,其定义对编译器不可用。do_stuff因此,如果您提供其定义及其所有用途,则可能会发生这种优化。