您好,登錄后才能下訂單哦!
函數的調用優化
在類中有四大成員函數,構造函數,拷貝構造函數,賦值函數和析構函數,在類外進行實例化時,若調用函數的方法不當則會產生時間和空間的浪費。
以下,將用幾個小栗子來說明函數的調用優化的常見辦法
類:
class Test { public: Test(int d = 0) : _data(d) { cout << "Create Test Object:"<<this << endl; } Test(const Test&x) :_data(x._data) { cout << "Copy Create Object:" <<this<< endl; } Test&operator=(const Test&x) { cout << "Assign:"<<this << endl; if (this != &x) { _data = x._data; } return *this; } ~Test() { cout << "Free Test Object:"<<this << endl; } public: int GetData() const { return _data; } private: int _data; };
方法
Test fun(Test x) { int value = x.GetData(); Test tmp(value); return tmp; } void main() { Test t1(100);//構造 Test t2;//拷貝構造 t2 = fun(t1); /* 1.fun函數的參數先做一份零時拷貝,調用構造函數; 2.用value拷貝構造tmp; 3.返回tmp時再用tmp創建臨時變量,調用拷貝構造函數; 4.出這個函數域后,創建的臨時變量進行析構,即x和tmp; 5.返回的值給t2賦值,調用賦值語句 6.完成完賦值語句后,析構臨時的無名對象(tmp的) 7.析構t2、t1。 */ getchar(); }
以上是未優化的方法,其占用空間,浪費時間
優化1:
Test fun(Test x) { int value = x.GetData(); return Test(value);//創建無名臨時變量,創建出的變量無名字 /* 返回時一般都會拷貝一個臨時變量再返回,但這里編譯器進行了優化 直接進行構造了一個無名臨時變量(減少了一次拷貝構造函數的調用和析構) */ } void main() { Test t1(100); Test t2; t2 = fun(t1); /* 直接用返回的無名臨時變量對t2進行賦值 */ getchar(); }
優化2
Test fun(Test&x) { /* fun函數中的參數是引用傳參,x不用再創建臨時對象,省去了拷貝構造函數的調用 */ int value = x.GetData(); return Test(value); }
優化3
int main() { Test t1(100); Test t2=fun(t1); //初始化,只調用構造函數 getchar(); }
優化后只調用兩次構造函數,兩次析構函數
ps:錯誤優化
Test &fun(Test&x) { int value = x.GetData(); return Test(value); //返回時不能返回無名臨時變量,由于這個是引用返回,一出函數域就被析構,其值不存在 }
關于一個函數是否可以引用返回要看這個對象是否為局部對象,若受這個函數域影響,則不能進行引用返回
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。