Tiêu đề của câu hỏi có thể hơi lạ, nhưng vấn đề là, theo như tôi biết, không có gì chống lại tối ưu hóa cuộc gọi đuôi cả. Tuy nhiên, trong khi duyệt các dự án mã nguồn mở, tôi đã gặp một số chức năng tích cực cố gắng ngăn trình biên dịch thực hiện tối ưu hóa lệnh gọi đuôi, ví dụ như việc triển khai CFRunLoopRef chứa đầy các bản hack như vậy . Ví dụ:
static void __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__() __attribute__((noinline));
static void __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__(CFRunLoopObserverCallBack func, CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info) {
if (func) {
func(observer, activity, info);
}
getpid(); // thwart tail-call optimization
}
Tôi rất muốn biết tại sao điều này dường như lại quan trọng đến vậy, và có trường hợp nào tôi là một nhà phát triển bình thường cũng nên ghi nhớ điều này không? Ví dụ. có những cạm bẫy thường gặp với tối ưu hóa cuộc gọi đuôi không?