C++中按值返回和返回值优化代码

C++和C语言相比,最为人诟病的就是其性能问题,通常一条C语言经编译器解释后,可以固定转换成5—10条汇编语言,但是一条C++语言,就没有这么幸运了,可能会是3条汇编语言,也可能是300条。C++影响性能的原因很多,其中一个就是临时对象的创建和销毁。这里我简述一种减少创建临时对象的方法--返回值优化问题

很多时候,函数需要按值返回,这其中就会不可避免地涉及到临时对象的创建和销毁。假设定义如下的Complex类:

class Complex
{
friend Complex operator +(const Complex&,const Complex&);
public:
Complex(double r=0, double i=0):real(r),imag(i)
{
cout<<"I'm in constructor"<<endl;
}
Complex(const Complex& c):real(c.real),imag(c.imag)
{
cout<<"I'm in copy constructor"<<endl;
}
Complex& operator =(const Complex& c)
{
real=c.real;
imag=c.imag;
cout<<"I'm in assignment"<<endl;
return *this;
}
void print()
{
cout<<real<<"+"<<imag<<"i"<<endl;
}
~Complex()
{
cout<<"I'm in destructor"<<endl;
}
private:
double real;
double imag;
};
Complex operator +(const Complex& a,const Complex& b)
{
/*Complex retVal;
retVal.real=a.real+b.real;
retVal.imag=a.imag+b.imag;
return retVal;*/
cout<<"calling plus"<<endl;
// return Complex(a.real+b.real,a.imag+b.imag);
Complex retVal(a.real+b.real,a.imag+b.imag);
return retVal;
}

时间: 2024-08-19 05:02:26

C++中按值返回和返回值优化代码的相关文章

.net中的函数可以返回多个值

函数 .net中的函数可以返回多个值了通过out关键字private string TestOut(out char i) { i = 'a';return "good study";}private void button_Click(object sender,System.EventArgs e) {char i;//不必初始化string getReturn = TestOut(out i);richTextBox1.AppendText("方法执行的返回值是:&qu

ASP中获得Select Count语句返回值的方法

  这篇文章主要介绍了ASP中获得Select Count语句返回值的方法,一般用在统计数据时使用Select Count语句,以此一获得查询到的行数,需要的朋友可以参考下 我们一般统计数据库记录时会用到Select Count(*)语句,当我们使用SQL Server的查询分析器时,直接输入Select Count(*) From 表名即会统计出该表中有几条记录,可是我们用ASP来实现时该怎么返回值呢?即如何输出统计出来的记录总数呢?请接着往下看. 其实我们只要给SQL语句的查询结果取个别名即

在JS方法中返回多个值的方法汇总

  本文给大家汇总了在javascript方法中返回多个值的方法,都是在个人项目中检验过的,这里推荐给大家,有需要的小伙伴可以参考下. 在使用JS编程中,有时需要在一个方法返回两个个或两个以上的数据,用下面的几种方法都可以实现: 1 使用数组的方式,如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <html> <head> <title>JS函数返回多个值</title> <

java中如果需要返回多个值怎么办

Java中如果需要返回多个值怎么办 首先我们明确一下:java方法的返回值只有一个,但是返回值的类型不限 有一种编程语言可以返回多个值 Python,实例如下:  运行结果如下: [whuang@huangwei function2]$ ./function_dict02.py My name is  Walter My age is  23   在java中如何达到相同的目的呢? (1)把这多个返回值再封装成为对象 可以封装成为java bean,数组,ArrayList ,甚至Map 下面看

java,比较json中 值的大小 , 返回的是键呢?

问题描述 java,比较json中 值的大小 , 返回的是键呢? [ { "key": "a", "value": 5 }, { "key": "b", "value": 3 }, { "key": "c", "value": 7 } ] 就这种json ,怎么实现比较的是value中的int的值的大小, 而返回的是key 比如

Javascript中怎么得到模式窗体返回的值

问题描述 Javascript中怎么得到模式窗体返回的值 解决方案 解决方案二:2.可以通过window.returnValue向打开对话框的窗口返回信息,当然也可以是对象.例如:------------------------------parent.htm<script>str=window.showModalDialog("modal.htm",,"dialogWidth=200px;dialogHeight=100px");alert(str);

mfc-在MFC中,如何通过RegisterWindowMessage()返回的值获取注册消息的内容?

问题描述 在MFC中,如何通过RegisterWindowMessage()返回的值获取注册消息的内容? 例如 UINT msg_myMsg = RegisterWindowMessage(L"MsgString"); 现在我知道msg_myMsg的值,那如何通过这个值获取到MsgString的内容呢?

linkedlist-java Arraylist和Linkedlist中set返回值为什么是old值

问题描述 java Arraylist和Linkedlist中set返回值为什么是old值 小弟自学了Arraylist和Linkedlist,但是有一点令我疑惑不解,求大婶帮助: public E set(int index, E element) { checkElementIndex(index); Node x = node(index); E oldVal = x.item; x.item = element; return oldVal; //我想问为什么这儿返回返回修改前的值(Ar

vb中2005中如何获取messbox的返回值(要详细介绍)顺便推荐学vb2005的教程,谢谢各位了!

问题描述 vb中2005中如何获取messbox的返回值(要详细介绍)顺便推荐学vb2005的教程,谢谢各位了! 解决方案 解决方案二:Result=MessageBox()Result=Msgbox()解决方案三:笨蛋方法:dimaasinteger=msgbox("笨蛋方法",1,"大笨蛋")ifa=1then...ifa=2then...

string-C#怎样在重写ToString()方法中一次返回多个值,如下

问题描述 C#怎样在重写ToString()方法中一次返回多个值,如下 public string clientCode { get; set; } public string clientName { get; set; } public string abbreviation { get; set; } public override string ToString() { return clientCode,clientName,contacts; } 这是一个类中,以上三个都要重写,有没