ta jest mniej lub bardziej prośba o wyjaśnienie Casting a function pointer to another type z przykładowym kodemOptymalizacja z funkcji pomocniczych
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);
}
Odpowiedź mówi „dobry” kompilator powinien być w stanie zoptymalizować się funkcję my_callback_helper()
ale znalazłem nie kompilator na https://gcc.godbolt.org że robi to i funkcji pomocnika dostaje zawsze generowany nawet jeśli to 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
Moje pytanie brzmi: czy w standardzie jest coś, co uniemożliwia kompilatorom eliminowanie pomocnika?
Z mojego doświadczenia wynika, że kompilatory mają tendencję do wykonywania niewystarczającej pracy przy wywoływaniu wywołania funkcji, nawet jeśli wartość wskaźnika funkcji może być określona podczas kompilacji. Możesz spróbować wrzucić słowo kluczowe "inline". O ile mi wiadomo, nie ma nic w standardzie uniemożliwiającego optymalizację. – Lundin