这或多或少是要求澄清的 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
所以我的问题是:标准中是否有任何内容阻止编译器消除帮助程序?
答案 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
及其所有用途提供定义,则可能会发生这种优化。