C++按值返回、按址返回、按別名返回開銷的區別
好久木有寫部落格了,前一段時間忙著畢業論文和答辯。最近對遊戲開發方面比較有興趣,就學習了一下C++,因為很多遊戲引擎都支援C++。花了幾天的時間基本系統的學習了一下C++的語法規範,看得是範類的C++視訊教程。這裡附上網盤地址:http://pan.baidu.com/s/1c0lB1Pu ,廢話不多說鳥,看下面
分別用程式碼表示一下三種返回:
A fn1(A a) //按值返回
A* fn3(A *a)//按址返回
A& fn2(A &a)//按別名返回
三個函式看起來產不多,但造成的開銷是不同的。按址返回和按別名返回的開銷是一樣的,都比較小,按值返回的開銷則比較大。因為這裡演示的按值返回不管是傳參或者返回時,都會呼叫類A的複製建構函式,建立一個類A的副本,將原物件的成員資料一個個拷貝到副本上,加入類A的成員資料很大的話,迴圈呼叫多幾次這個函式造成的開銷是不估量的,下面就用程式碼演示一下;
首先定義一個A類,和按值返回
#include <iostream>
using namespace std;
class A
{
public:
A(int j){ cout << "建構函式ggg" << endl; this->i = j; }
A(A const &a){ cout << "複製建構函式fff" << endl; this->i = a.i; i++; }//加const關鍵字保證原物件的資料不被修改
~A(){ cout << "解構函式xxx" << endl; }
int get(){ return this->i; }
private:
int i;
};
A fn1(A a) //按值返回
{
cout << a.get() << endl;
return a;
}
void main()
{
A a(4);
A b(4);
cout << a.get() << endl;
b = fn1(a);
cout << b.get() << endl;
system("pause");
}
結果:
按址返回:
A* fn3(A *a)//按址返回
{
cout << a->get() << endl;
return a;
}
void main()
{
A c(4);
cout << c.get() << endl;
A &d = fn2(c);
cout << d.get() << endl;
system("pause");
}
結果:
按別名返回:
A& fn2(A &a)//按別名返回
{
cout << a.get() << endl;
return a;
}
void main()
{
A c(4);
cout << c.get() << endl;
A &d = fn2(c);
cout << d.get() << endl;
system("pause");
結果:
從結果可以看出來按 址返回和按地址返回的開銷是一樣的
相關文章
- JavaScript 點選按鈕返回底部JavaScript
- 多型中的返回值型別多型型別
- 返回hash 型別的json型別JSON
- JavaScript點選按鈕返回底部詳解JavaScript
- MySQL 按指定 ID 順序返回結果MySql
- Mysql按指定 ID 順序返回結果MySql
- js中的typeof返回值的所有型別JS型別
- JavaSE 形參和返回值(引用型別)Java型別
- 原始碼 | 靜態工廠返回宣告的返回型別的子型別的例項原始碼型別
- 小程式沒有返回按鈕怎麼辦?
- 按關鍵字搜尋dangdang商品返回展示
- 形式引數和返回值型別的對比型別
- 京東按關鍵字搜尋商品 API 返回值說明API
- 19、Overload和Override的區別。Overloaded的方法是否可以改變返回值的型別?IDE型別
- Android按下返回鍵,將應用退到後臺Android
- typeof返回值
- Laravel 返回值Laravel
- iOS開發:給UIWebview的導航欄新增返回、關閉按鈕iOSUIWebView
- 淘寶/天貓按分類搜直播介面 API 返回值說明API
- 阿里巴巴按關鍵字搜尋商品 API 返回值說明阿里API
- 如何在Typescript中定義Promise的返回值型別TypeScriptPromise型別
- SpringMVC-方法四種型別返回值總結SpringMVC型別
- c++函式引數和返回值C++函式
- 函式的返回值函式
- 唯品會按關鍵字搜尋vip商品 API 返回值說明API
- python 呼叫 shell ,獲取返回值和返回資訊Python
- js基本資料型別與typeof返回值(圖示)JS資料型別
- java統一返回標準型別Java型別
- 介面之多種返回資料型別資料型別
- 全部按教程走,第三方登陸,返回的是:
- Python的and和or的返回值Python
- std::packaged_task<返回型別(引數型別)>Package型別
- 京東按圖搜尋京東商品(拍立淘) API 返回值說明API
- 亞馬遜國際按關鍵字搜尋商品 API 返回值說明亞馬遜API
- springMVC中controller的返回值SpringMVCController
- 0305函式返回值函式
- typeof返回值詳解
- 電商API介面:lazada按關鍵字搜尋商品(引數、返回值說明)API
- vue js 獲取滾動距離 以及 返回頂部按鈕VueJS