C 返回值優化RVO

2021-09-22 07:42:05 字數 1858 閱讀 9745

返回值優化,是一種屬於編譯器的技術,它通過轉換源**和物件的建立來加快源**的執行速度。

rvo = return value optimization。

測試平台:stm32f103vg + keil 5.15

背景:我們有個macaddress::toarray

byte* macaddress::toarray() const

因為封裝需要,打算返回位元組陣列類bytearray的物件,於是有

bytearray macaddress::toarray() const

呼叫**

bytearray bs = mac.toarray();

bs.copyto(general_reg.shar);

按照我淺薄的c++知識理解,在toarray內return 的時候,會產生一次物件拷貝,到臨時物件。

然後在呼叫者那裡的等號,產生一次拷貝構造。

實際上,編譯燒寫除錯,檢視反彙編

358:         bytearray bs = mac.toarray(); 

0x0800595c 4629

mov r1,r5

0x0800595e a804 add r0,sp,#0x10

0x08005960 f000fe92 bl.w macaddress::toarray (0x08006688)

359: bs.copyto(general_reg.shar);

360:

0x08005964 2300 movs r3,#0x00

0x08005966 461a mov r2,r3

0x08005968 f1040109 add r1,r4,#0x09

0x0800596c a804 add r0,sp,#0x10

0x0800596e f002fb8f bl.w array::copyto (0x08008090)

直接分配記憶體,傳入toarray使用。toarray之後,並沒有見到所猜想的第二次拷貝構造。

下面看看toarray的反彙編

0x08006688 b570      push     

0x0800668a 4605

mov r5,r0

0x0800668c 460c

mov r4,r1

481: return bytearray((byte*)&value, 6);

0x0800668e 2206 movs r2,#0x06

0x08006690 f1040108 add r1,r4,#0x08

0x08006694 4628

mov r0,r5

0x08006696 f7fffdeb bl.w _zn9bytearrayc2epkhi (0x08006270)

0x0800669a 4605

mov r5,r0

482: }

0x0800669c bd70 pop

天哪!這裡面只有一次建構函式,並不是猜想的那樣,先構造本地變數,然後return再拷貝。

並且,這個建構函式的記憶體位址,正是外部傳進去的那乙個。

這個就是c++的rvo,返回值優化技術,沒想到mdk也支援。

這個技能的獲取,讓我c++水平從30%提公升到40%

我不相信神話,我只相信汗水!我不相信命運,我只相信雙手!

分類:

c++

C 返回值優化RVO

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

函式返回值與RVO優化

rvo優化 return value optimistic,指當乙個函式返回乙個值型別而非引用型別時,可以繞過拷貝 移動建構函式,直接在呼叫函式的地方構造返回值。要發生rvo需要有三個條件 1,如果型別是自定義型別,那麼此時的拷貝 移動建構函式是可訪問的 2,返回型別必須與實際型別完全一致,即返回時...

20 協助完成「返回值優化(RVO)」

19 最後曾提到了在函式通過傳值方式 by value 返回乙個物件時,不可避免地要生成乙個臨時物件,這會嚴重影響到程式的效率,如下例計算兩個分式的乘積 class crational int numer const get numerator int denom const get denomin...