日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++中返回对象的情形及RVO

發布時間:2024/4/17 c/c++ 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++中返回对象的情形及RVO 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://www.cnblogs.com/xkfz007/archive/2012/07/21/2602110.html

?

之前有文章介紹過臨時對象和返回值優化RVO方面的問題。見此處。

在C++中,返回對象這一點經常被詬病,因為這個地方的效率比較低,需要進行很多的操作,生成一些臨時對象,如果對象比較大的會就會比較耗時。但是在編譯器實現的時候,經常是對返回對象的情況進行優化,也就是進行返回值優化?。

在g++中,這個是默認已經進行了優化。以前我希望看看到底C++怎么操作的,但是無法看到,就是因為G++進行了默認的返回值優化RVO。今天在晚上發現可以有一中方法來禁止這個RVO,可以參考這兒。

具體來說就是在編譯的時候,加上-fno-elide-constructors這個選項,

?

#include <iostream> using namespace std;class HasPtrMem { public:HasPtrMem(): d(new int(3)) {cout << "Construct: " << ++n_cstr << endl;}HasPtrMem(const HasPtrMem & h): d(new int(*h.d)) {cout << "Copy construct: " << ++n_cptr << endl;}HasPtrMem(HasPtrMem && h): d(h.d) { // 移動構造函數h.d = nullptr; // 將臨時值的指針成員置空cout << "Move construct: " << ++n_mvtr << endl;}~HasPtrMem() {delete d;cout << "Destruct: " << ++n_dstr << endl;}int * d;static int n_cstr;static int n_dstr;static int n_cptr;static int n_mvtr; };int HasPtrMem::n_cstr = 0; int HasPtrMem::n_dstr = 0; int HasPtrMem::n_cptr = 0; int HasPtrMem::n_mvtr = 0;HasPtrMem GetTemp() {HasPtrMem h;cout << "Resource from " << __func__ << ": " << hex << h.d << endl;return h; }int main() {HasPtrMem a = GetTemp();cout << "Resource from " << __func__ << ": " << hex << a.d << endl; }

?

編譯執行:

g++ std_move4.cpp -std=c++11$./a.out Construct: 1 Resource from GetTemp: 0x2572010 Resource from main: 0x2572010 Destruct: 1

?

添加?-fno-elide-constructors 選項,然后編譯執行

$g++ std_move4.cpp -std=c++11 -fno-elide-constructors$./a.out Construct: 1 Resource from GetTemp: 0x6e7010 Move construct: 1 Destruct: 1 Move construct: 2 Destruct: 2 Resource from main: 0x6e7010 Destruct: 3

可以清晰的看到兩次?Move construct 的執行

?

總結

以上是生活随笔為你收集整理的C++中返回对象的情形及RVO的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。