này được nhiều hơn hoặc ít hơn một đề nghị làm rõ về Casting a function pointer to another type với mã ví dụTối ưu hóa ra chức năng helper
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);
}
Câu trả lời nói rằng một "tốt" trình biên dịch sẽ có thể tối ưu hóa ra các my_callback_helper()
chức năng nhưng tôi tìm thấy không có trình biên dịch tại https://gcc.godbolt.org nào đó và chức năng helper được luôn tạo ra ngay cả khi nó 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
Vì vậy, câu hỏi của tôi là: Có bất cứ điều gì trong tiêu chuẩn ngăn chặn trình biên dịch từ loại bỏ người trợ giúp?
Theo kinh nghiệm của tôi, các trình biên dịch có xu hướng làm một công việc kém tại các cuộc gọi hàm con trỏ nội tuyến ngay cả khi giá trị của con trỏ hàm có thể được xác định tại thời gian biên dịch. Bạn có thể thử quăng vào từ khóa 'inline'. Theo tôi biết, không có gì trong tiêu chuẩn ngăn chặn tối ưu hóa. – Lundin