聊聊“尾遞迴優化“簡介拷貝構造&拷貝賦值
阿新 • • 發佈:2019-02-10
尾遞迴優化
尾遞迴.顧名思義,將本函式的工作結果作為引數,呼叫本函式,然後將其結果返回.
尾遞迴可以被優化.原因在於:在尾遞迴中我們不需要儲存上一次本函式呼叫的結果.因為我們已經在尾部了:)
怎麼優化呢?
用for迴圈即可:
//尾遞迴
Recursion(int a)
{
if(退出條件)
{
return X
}
具體操作;
Recursion(a);
}
//用for優化後:
for(;**!退出條件**;)
{
具體操作;
}
輕鬆解決爆棧有木有?
聊一件與尾遞迴相關的事情,
當年寫win32偵錯程式的時候,碼過一段自認為爽的程式碼,它順暢地打印出了當前程式的棧回溯
//棧回溯遞迴搜尋
void kRecur(DWORD* dwEbp)
{
if(nullptr==dwEbp)
{return;}
DWORD dwNewEbp=0;
if( false==ReadDebuggedMemory((PVOID)dwEbp,4,_Out_ (BYTE*)(&dwNewEbp)))
{
return ;
}
DWORD dwFunReturnPath=0;
if (false==ReadDebuggedMemory((PVOID)(dwEbp+1),4,_Out_ (BYTE*)(&dwFunReturnPath)))
{
return ;
}
if (0!=(DWORD)dwNewEbp)
{
kRecur((DWORD*)dwNewEbp);
}
return ;
}
後來學優化的時候才發現它是一個尾遞迴。囧。
拷貝構造&拷貝賦值
當對一個物件有複製操作,如作為引數傳入一個函式,以及:
class V
{
......
}
V* CA=new V();
V *CB=*CA();//發生拷貝構造
拷貝構造就是C++設計者給我們的一個機會,讓我們在上面所說的事件發生時能做一些操作.
想把握控制這個機會的話,你需要宣告如下:
/*拷貝建構函式 */
CExample(const CExample& C)
{
//......
}
賦值構造同樣可以複製物件
/*賦值構造 */
const CExmple& operator=(const CExmple& operator C)
{
//......
}
以上內容還被用在單例模式中。
語法靈活歸靈活,但是不慎誤用又沒有錯誤提醒就慘了。
關於主題更詳細的內容可參看:
拷貝構造詳解-ChinaUnix
推薦看這個:
拷貝建構函式詳解
晚安
2016年5月13日 00:26:19
修訂
2016年5月23日 21:29:37