C 函式引數傳遞與返回值優化技巧

2021-07-12 05:24:00 字數 2105 閱讀 6280

很久沒登陸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 二 關於指標 指標變數值就是位址,我們的程式是從上往下執行的,程式又是存放到程式空間的,所以每...