高效率的C 函式返回值

2021-07-02 16:48:45 字數 3396 閱讀 8566

分類: 基礎程式設計

2009-10-11 20:55

2601人閱讀收藏 

舉報c++

string

float

編譯器儲存

reference

1.有時候返回引用可以提高效率,有些情況不能返回引用

類的賦值運算子函式中,返回物件的引用可以顯著提高效率。

[cpp]view plain

copy

class

string  

string & string::operate=(const

string &other)    

上面如果用「值傳遞」的方式,雖然功能仍然正確,但由於return語句要把 *this拷貝到儲存返回值的外部儲存單元之中,增加了不必要的開銷,降低了賦值函式的效率。

string的相加函式operate + 的實現如下:

[cpp]view plain

copy

string  operate+(

const

string &s1, 

const

string &s2)      

對於相加函式,應當用「值傳遞」的方式返回string物件。如果改用「引用傳遞」,那麼函式返回值是乙個指向區域性物件temp的「引用」。由於temp在函式結束時被自動銷毀,將導致返回的「引用」無效。

設想一下,相加運算子過載函式應該是引數列表中的兩個物件相加,必須產生乙個新的物件並返回它。這區別於+=運算子,+=運算子是將右邊的物件累加到左邊的物件上,因此+=的實現應當返回運算子左邊物件的引用。

2. 返回靜態區域性變數的引用往往會帶來問題

上面已經說了operator+函式中不能返回臨時物件的引用,那麼返回靜態區域性變數的引用呢?靜態區域性變數的生命不會隨著函式消失而結束,返回其引用似乎可行,但這樣做往往會給程式帶來問題。

[cpp]view plain

copy

const

rational& operator*(

const

rational& lhs, 

const

rational& rhs)    

下面if恒為真,靜態區域性變數對全域性可見,每次operator*返回的是它的引用,相當於是返回它的「新值」。

[cpp]view plain

copy

bool

operator==(

const

rational& lhs, 

const

rational& rhs); 

// an operator== for rationals

rational a, b, c, d;  

...  

if((a * b) == (c * d))    

else  

3. 返回臨時物件,不要定義區域性物件返回

string temp(s1 + s2);

return temp;

上述**將發生三件事。首先,temp物件被建立,同時完成初始化;然後拷貝建構函式把temp拷貝到儲存返回值的外部儲存單元中;最後,temp在函式結束時被銷毀(呼叫析構函式)。然而,建立乙個臨時物件並返回它:return temp(s1 + s2);,編譯器直接把臨時物件建立並初始化在外部儲存單元中,省去了拷貝和析構的化費,提高了效率。

由於內部資料型別如int,float,double的變數不存在建構函式與析構函式,雖然該「臨時變數的語法」不會提高多少效率,但是程式更加簡潔易讀。

4. 注意不要返回棧指標和常量字串

不要用return語句返回指向「棧記憶體」的指標,因為該內存在函式結束時自動消亡。

[cpp]view plain

copy

char

*getstring(

void

)    

void

test4(

void

)    

函式test5執行雖然不會出錯,但是函式getstring2的設計概念卻是錯誤的。因為getstring2內的「hello world」是常量字串,位於靜態儲存區,它在程式生命期內恆定不變。無論什麼時候呼叫getstring2,它返回的始終是同乙個「唯讀」的記憶體塊。

[cpp]view plain

copy

char

*getstring2(

void

)    

void

test5(

void

)    

5. 謹慎返回物件內部成員物件的引用

有時候希望使得類物件占用空間較小,通常可以使用乙個指向物件資料的指標作為該類的資料成員,如rectangle類的成員指標pdata。類的成員函式upperleft和lowerright僅僅是想獲取類的資料內容而不想修改其內容,因此函式結尾使用了const表示類的資料成員不可更改。然而卻不能達到設計的目的,雖然成員是私有,然而卻通過公有函式返回了可以修改它的引用。如可以這樣修改它:rectangle r(&rd); r.upperleft().setx(5);

[cpp]view plain

copy

class

point  

void

setx(

float

f)  

void

sety(

float

f)  

private

:  float

x, y;  

};  

struct

rectdata  

point ulhc, lrhc;  

};  

class

rectangle   

point& upperleft() const

point& lowerright() const

private

:  rectdata *pdata;  

};  

因此需要將兩函式改為,這樣想試圖修改點的資料內容時,編譯器會報錯。

[cpp]view plain

copy

const

point& upperleft() 

const

const

point& lowerright() 

const  

effective c++

高質量 c/c++ 程式設計指南

C 函式返回值。

一 params.可變引數,無論有幾個引數,必須出現在引數列表的最後,可以為可變引數直接傳遞乙個對應型別的陣列。class program test msg intarry static void test string msg,params int args 二 ref 引用傳遞 三 out ou...

主函式的返回值返回給誰 主函式返回值

responsebody報406 原因是 要返回的物件沒有setget方法sdfsdf 自定義視 析器和缺省視 析器需同時使用才好用 如果以redireci或forward字首,那麼 走缺省視 析器 return redirect index.jsp return forward index 需寫全...

函式返回值

這裡接著探求被調函式的返回值是如何傳遞到主調函式中的,下面為c程式。add函式通過直接返回a b的,而add1函式先定義乙個區域性變數c,儲存a b的值,然後再返回c的值。其中a b可以當成乙個臨時變數,其結果是暫時存放在暫存器中的 eax 參照反匯程式設計序,可以看出函式的值並不是通過壓棧 基址定...