优化辅助函数

时间:2017-09-27 11:53:48

标签: c callback language-lawyer function-pointers

这或多或少是要求澄清的 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()函数,但我在https://gcc.godbolt.org找不到编译器  这样做,即使它是just a jump to 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

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

1 个答案:

答案 0 :(得分:3)

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

您已取foreach ($items as $item) { $data[$item->name]['Name'] = $item->name; $data[$item->name][$item->class] = $item->score; $data[$item->name]['hasScore'] = is_null($item->score); } $arrayDataProviderInit = [ 'allModels' => $arrayData, 'pagination' => [ 'pageSize' => 0, ], 'sort' => [ 'attributes' => [ 'Name', 'Score' => [ 'asc' => ['hasScore' => SORT_ASC, 'Score' => SORT_ASC], 'desc' => ['hasScore' => SORT_ASC, 'Score' => SORT_DESC], ], ], ], ]; 的地址。因此,编译器无法轻松优化它,因为它不知道my_callback_helper对它的作用。在定义do_stuff的单独模块中,编译器不知道它可以简单地使用/ call do_stuff代替其参数(my_callback_function)。为了完全优化my_callback_helper,编译器必须知道my_callback_helper的作用。但do_stuff是一个外部函数,其定义不适用于编译器。因此,如果您为do_stuff及其所有用途提供定义,则可能会发生这种优化。