C RVO NRVO以及move語義的影響

2021-09-23 23:23:27 字數 2386 閱讀 4696

c++返回值優化和具名返回值優化是編譯器的優化,在大多數情況下能提高效能,但是卻難以受程式設計師控制。c++11中加入了move語義的支援,由此對rvo和nrvo會造成一定影響。下面以一段**來說明。

rvo和nrvo在分別在copy/move construct,copy/move assignment八種簡單情況,測試條件是g++ 4.8.2和clang++ 3.4,預設優化。

#include 

#include

#include

struct test

test(const test&)

test& operator=(const test&)

test(test&&)

/*test& operator=(test &&t)

*/~test()

};test gettest()

test gettestwithname()

int main()

測試結果:

**********===rvo**********====

++test obj rvo for copy construct

construct a test object

--------------

++test obj rvo for move construct

construct a test object

move construct a test object

destruct a test object

--------------

++test obj rvo for copy assignment

construct a test object

construct a test object

move assignment a test object

destruct a test object

--------------

++test object rvo for move assignment

construct a test object

construct a test object

move assignment a test object

destruct a test object

**********===nrvo**********====

++test obj nrvo for copy construct

construct a test object

--------------

++test obj nrvo for move construct

construct a test object

move construct a test object

destruct a test object

--------------

++test obj nrvo for copy assignment

construct a test object

construct a test object

move assignment a test object

destruct a test object

--------------

++test obj nrvo for move assignment

construct a test object

construct a test object

move assignment a test object

destruct a test object

******************************

destruct a test object

destruct a test object

destruct a test object

destruct a test object

destruct a test object

destruct a test object

destruct a test object

destruct a test object

由此可得出幾個簡單結論:

1.copy construct本身在rvo和nrvo兩種情況下被優化了,如果再加上move反而畫蛇添足。

2.加入了move assignment後,預設是呼叫move assignment而不是copy assignment,可以將move assignment注釋後測試。

3.對於rvo和nrvo來說,construction的情況編譯器優化得比較好了,加入move語義主要是對於assignment有比較大影響

c 右值以及move

之前對move一直存在誤解,想得太萬能了。右值實際上就是臨時記憶體,類似於 1 2 可以int number 1 2 move的話是將引數變成自身型別的右值,然後賦值給其他變數。我一開始以為move是交換兩塊記憶體的指標之類,複雜度是o 1 那種,後來測試了一下發現並不是這樣。測試 如下 inclu...

mac配置texshop以及latex語法

brew cask install basictex 參考 參考 usepackage includepdf addtotoc pages 1 1,offset 0cm 0.5cm includepdf addtotoc pages 4 4,offset 0cm 0.5cm 其中pages 1 2是...

js中if條件語句以及switch條件語句的使用

if語句簡單使用 if和else if相比,else if效率更高,因為else if中前面判斷過的條件後面不需要再重複判斷,而全部使用if則需要重複判斷 var one 5 if one 2 if one 6 one為0,因為one 6會執行 console.log one 例 在頁面輸入數值及運...