看起来,在函数中有一个本地数组会阻止所有编译器对其进行尾调用优化:
int foo(int*);
int tco_test() {
// int arr[5]={1, 2, 3, 4, 5}; // <-- variant 1
// int* arr = new int[5]; // <-- variant 2
int x = foo(arr);
return x > 0 ? tco_test() : x;
}
当变量1
激活时,在结尾处会真正调用tco_test()
(gcc试图在之前进行一些展开,但最终仍会调用该函数)。变量2
按预期执行尾递归优化。
是否有本地数组中的某些内容使得无法优化尾递归调用?
return tco_test()
并没有什么区别,只是为了防止编译器认为我在那里存在未定义的行为。 - SergeyA