返回值優化,是一種屬於編譯器的技術,它通過轉換源**和物件的建立來加快源**的執行速度。
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
movr1,r5
0x0800595e a804
addr0,sp,#0x10
0x08005960 f000fe92 bl.w
macaddress:
:toarray (0x08006688)
359: bs.copyto(general_reg.shar);
360:
0x08005964
2300
movs r3,#0x00
0x08005966 461a
movr2,r3
0x08005968 f1040109
addr1,r4,#0x09
0x0800596c a804
addr0,sp,#0x10
0x0800596e f002fb8f bl.w
array::copyto (0x08008090)
直接分配記憶體,傳入toarray使用。toarray之後,並沒有見到所猜想的第二次拷貝構造。
下面看看toarray的反彙編
0x08006688 b570 push0x0800668a
4605
movr5,r0
0x0800668c 46
0cmov
r4,r1
481: return bytearray((byte*)&value, 6);
0x0800668e 2206
movs r2,#0x06
0x08006690 f1040108
addr1,r4,#0x08
0x08006694
4628
movr0,r5
0x08006696 f7fffdeb bl.w _zn9bytearrayc2epkhi (0x08006270)
0x0800669a
4605
movr5,r0
482: }
0x0800669c bd70
pop
天哪!這裡面只有一次建構函式,並不是猜想的那樣,先構造本地變數,然後return再拷貝。
並且,這個建構函式的記憶體位址,正是外部傳進去的那乙個。
這個就是c++的rvo,返回值優化技術,沒想到mdk也支援。
這個技能的獲取,讓我c++水平從30%提公升到40%
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...