Я пришел к выводу, что все основные компиляторы не будут выполнять оптимизацию хвостового вызова, если вызываемая функция не возвращает (т. Е. Помечена как _Noreturn
/ [[noreturn]]
или после вызова __builtin_unreachable()
).Это предполагаемое поведение, а не пропущенная оптимизация, и если да, то почему?
Пример 1:
#ifndef __cplusplus
#define NORETURN _Noreturn
#else
#define NORETURN [[noreturn]]
#endif
void canret(void);
NORETURN void noret(void);
void foo(void) { canret(); }
void bar(void) { noret(); }
C: https://godbolt.org/z/pJfEe- C ++: https://godbolt.org/z/-4c78K
Пример 2:
#ifdef _MSC_VER
#define UNREACHABLE __assume(0)
#else
#define UNREACHABLE __builtin_unreachable()
#endif
void f(void);
void foo(void) { f(); }
void bar(void) { f(); UNREACHABLE; }
https://godbolt.org/z/PFhWKR