很久沒登陸csdn,最後一次發帖是換工作的散分貼,之後背井離鄉,一去就是八年。八年前的自己對技術充滿熱情,但是有些井底之蛙,也有些偏激。八年過去,恍然大悟,技術無論大小,總應該有些積累,有些沉澱,有些能讓自己和後來之人收益之處,於是乎開始著手寫技術文章,文章或許淺顯,但或多或少可以與君交流提高。廢話那麼多,那麼第一章就說點簡單的吧。
c++函式的資料傳遞,這裡主要指引數傳遞與返回值。寫這篇的目的主要是總結如何高效的使用函式。
先來說說函式引數的傳遞,乙個簡單的示例:
class param_obj;
class return_obj;
return_obj func(param_obj);
這裡的引數傳遞採用的是按值傳遞
如果讀過《effective c++》,或許記得書中第二十條,使用常量引用(pass-by-reference-to-const)來代替按值傳遞(pass-by-value)。
很明顯傳遞引用省去了拷貝建構函式的執行,對於複雜物件例如其包含指向堆的指標或者是多個基類的子類,那麼省下的不止乙個函式的執行。關於其他理由,可直接看第二十條描述,這裡不做贅述。
說下常量引用,或許很多人包括我自己曾喜歡直接傳遞非常量引用。這裡按值傳遞,本身就不希望通過該變數帶回資料(也不推薦),所以不給函式引數物件的修改許可權是合情合理的。那麼有一點值得注意的就是,該物件的get方法,甚至那些計算但不修改物件的方法都應加常量限定符const。常量物件只能呼叫常量方法。
於是示例**如下:
class param_obj;
class return_obj;
return_obj func(const param_obj&);
習慣使用常量限定符來描述那些不改變類的方法是有很多好處的,且也最符合設計邏輯
接下來看函式返回值。
沒錯,《effective c++》第21條談到了返回值,主要談到不要為了效率而返回引用或者指標等,具體請自行查閱,這裡不詳述。
這裡筆者主要想提兩種方式
第一是利用rvo(return value optimization),返回值優化。看如下的例子。
#includeusing namespace std;
class data;
data(const data &data)
可以大膽的改為
vectorthings = getthings();
vectorgetthings()
這種寫法的好處是很多的,呼叫處更簡潔,返回的vector也可以直接巢狀於for語句或作為其他函式輸入。
除了rvo,另一種可以利用的是右值引用。這個是c++11的特性。需開啟編譯開關。
如下示例
#includeusing namespace std;
class data;
data(const data &data){
cout<<"copy constructor"<
rvalue assignment operator
assignment operator
可以看出, 因為賦值符號右邊是函式返回的區域性物件,呼叫了傳遞右值的賦值操作。右值一般後面不會再被引用,所以這裡可做的優化便是右值中的變數可以直接轉移,包括指標,無需新申請記憶體。關於更具體的左右值概念,可以檢視網上資料。這裡不做詳述。
了解rvo 與 右值引用在很多情況下可以寫出更合理與高效的編碼。 當然根據專案實際情況,返回指標或是引用也會出現,當然相信仔細琢磨也能找出更優雅的解決方案。
做個小結:
關於引數傳遞:
使用常引用代替值傳遞
學會用const限定方法。
關於返回值:
rvo與nrvo解決了臨時物件的copy
學會在函式返回賦值時定義物件
右值引用能有效改善賦值的效率,特別有指向堆的內容時
C函式引數傳遞與返回值傳遞
1 引數傳遞 stdcall和 cdecl都是函式呼叫約定關鍵字,先給出這兩者的區別,然後舉例項分析 stdcall 引數由右向左壓入堆疊 堆疊由函式本身清理。cdecl 引數也是由右向左壓入堆疊 但堆疊由呼叫者清理。另外,這兩者在同一名字修飾約定下,編譯過後變數和函式的名字也不一樣,具體見另一博文...
c 類的引數傳遞與返回值優化
1.類的成員變數要設定成私有 2.建構函式使用初始化列表來初始化變數 1 建構函式傳遞引數時,盡量使用如下形式,因為建構函式執行兩件事情,初始化和賦值,而使用如下形式,則只執行了初始化操作,減少了賦值的過程 class complex private double re,im 3.私有建構函式 把建...
hjr C 函式呼叫與引數傳遞與返回值
c語言就是由很多子函式組成的模組化語言 引數是體現乙個函式靈活性的重要工具 首先說下pc程式指標,pc是乙個暫存器,裡面的值指向當前程式 執行點的位址 既然是指標那麼,可以看這裡了解一下指標hjr教程 c 二 關於指標 指標變數值就是位址,我們的程式是從上往下執行的,程式又是存放到程式空間的,所以每...