Зачем коду активно пытаться предотвратить оптимизацию хвостового вызова?

Название вопроса может показаться несколько странным, но дело в том, что, насколько мне известно, вообще нет ничего, что говорило бы против оптимизации хвостовых вызовов. Однако, просматривая проекты с открытым исходным кодом, я уже наткнулся на несколько функций, которые активно пытаются помешать компилятору выполнять оптимизацию хвостового вызова, например, реализация CFRunLoopRef, которая полна таких хаков. . Например:

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
}

Я хотел бы знать, почему это кажется таким важным, и есть ли случаи, когда я, как обычныйразработчик, тоже должен помнить об этом? Например. Существуют ли распространенные ошибки при оптимизации хвостовых вызовов?

79
задан Jonathan Leffler 28 May 2012 в 22:14
поделиться