C 返回值優化

2021-07-08 11:38:33 字數 868 閱讀 9651

當函式需要返回物件時,通常有兩種寫法,一種是直接在return語句中返回乙個物件,一種是先構造好乙個物件,然後在return中將其返回。以下**為例:

#include #include using namespace std;

struct node

node(const node& n) : name(n.name), x(n.x), y(n.y) {}

~node()

};node add_1(const node& a, const node& b)

node add_2(const node& a, const node& b)

int main()

編譯器對add_1和add_2返回值的處理方式不一樣,對方式1,臨時物件作返回值,編譯器明白對這個臨時物件沒有其他需求,只是返回它,因此編譯器直接把這個物件建立在外部返回值的記憶體單元,因為不是真正建立乙個區域性物件,所以僅需要乙個普通的構造函式呼叫(不需要拷貝建構函式),且不會呼叫析構函式,效率很高。

而對方式2, 首先建立temp物件,呼叫建構函式,然後拷貝建構函式把temp拷貝到外部返回值的儲存單元裡,最後,當temp在作用域的結尾時呼叫析構函式。( 但是,實際中不同編譯器對此的處理方式不同,gcc4.8.1對這種方式的處理跟方式1一樣,都不呼叫拷貝建構函式,而ms的編譯器則如上所述。而這種優化方式,其實就是nrv優化,named return value,有名字的返回變數優化,內部將返回值_result作為引數傳進函式,對返回變數的操作實際都在這個_result上進行,從而減少拷貝建構函式的呼叫次數和產生物件的個數)

返回值優化

通過傳值方式返回要建立新物件時,應注意使用的形式,例如在operator return integer left.l right.l 咋看起來這像是乙個 對乙個建構函式的呼叫 其實並非如此。這是臨時物件語法,它是在說 建立乙個臨時integer物件並返回它 據此我們可能認為如果建立乙個有名字的區域性...

返回值優化

返回值優化,是一種屬於編譯器的技術,它通過轉換源 和物件的建立來加快源 的執行速度。rvo return value optimization。class complex 複數 complex const complex a real a.real imag a.imag complex opera...

C 返回值優化RVO

返回值優化,是一種屬於編譯器的技術,它通過轉換源 和物件的建立來加快源 的執行速度。rvo return value optimization。測試平台 stm32f103vg keil 5.15 背景 我們有個macaddress toarray byte macaddress toarray c...