C++按值返回、按址返回、按別名返回開銷的區別

君墨痕發表於2014-02-26

好久木有寫部落格了,前一段時間忙著畢業論文和答辯。最近對遊戲開發方面比較有興趣,就學習了一下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");

結果:

從結果可以看出來按 址返回和按地址返回的開銷是一樣的

相關文章