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 例 在頁面輸入數值及運...