我想了解C++中尾部調用優化的含義。考慮下面的代碼段:局部變量和尾部調用優化
#include <iostream>
#include <string>
size_t mystrlen(const char* input, size_t size = 0){
if(!*input){
return size;
}else{
std::string str(input+1);
return mystrlen(str.c_str(),size + 1);
}
}
int main(void){
std::cout << mystrlen("Foo") << std::endl; //3
}
mystrlen
爲(無用)函數,用於計算所提供的C字符串的長度。考慮else分支:創建一個新的std::string
實例,並將其內部緩衝區用作下一個調用的輸入。如果發生尾部調用優化,並且沒有創建新的堆棧幀,是否會導致錯誤,因爲在下一次調用發生之前本地變量str
將被銷燬?
在這種情況下,尾部調用優化不會發生,因爲析構函數需要在返回後調用。 – Simple
我的猜測是(基於直覺和邏輯結論),如果非POD對象的生命週期包含遞歸返回語句(即它在之前被構造,在返回之後被析構),那麼尾部調用優化是不可能的,因爲對於每個遞歸另一個對象生活。因此,所有這些對象都需要空間... [除非編譯器能夠檢測到該對象根本不需要,就像在此代碼中一樣;]] – leemes
不要依賴尾部優化來避免堆棧溢出你的代碼。 –