考慮下面的代碼:VS2010 C++尾調用優化的
int fac_aux(int x, int res) {
if(x == 1) return res;
else return fac_aux(x - 1, res * x);
}
int fac(int x) {
return fac_aux(x, 1);
}
int main() {
int x = fac(50);
std::cout << x;
return 0;
}
根據生成的ASM文件一切正常,尾呼叫被優化。
嘗試用
int x = fac_aux(50, 1);
自嘆不如更換
int x = fac(50);
,但尾調用優化的消失。據我記得在VS2008中沒有這種奇怪的編譯器行爲。任何想法爲什麼會發生這些事情,以及如何確保尾巴呼叫優化完成?
;函數編譯標誌:/ Ogtp
嘗試了/ O2和/ Ox優化標誌。有沒有其他編譯器選項很重要?
編輯:VS2012設法做了優化
修改代碼時,你是否刪除了'fac'函數? – SirDarius 2011-03-08 12:52:42
不,它仍然存在 – Voivoid 2011-03-08 13:11:47
所以沒有得到優化的功能實際上從來沒有被調用過?或者你是否在談論第一拳功能中的尾巴呼叫? – Euqil 2011-07-29 11:14:58