美文网首页Exceptional C++
【Exceptional C++(4)】临时对象

【Exceptional C++(4)】临时对象

作者: downdemo | 来源:发表于2018-01-26 14:34 被阅读5次

问题

  • 下面代码中至少有三处用到了不必要的临时对象,找出来
string FindAddr(list<Employee> l, string name)
{
    for (list<Employee>::iterator i = l.begin(); i != l.end(); i++)
    {
        if ( *i == name)
        {
            return (*i).addr;
        }
    }
    return "";
}

解答

  • 前两处:第一行的函数参数,使用传值导致list和string的拷贝,应当使用const&
  • 第三处:for循环中的i++,后增在递增前还要一个临时对象保存递增前的值
  • 第四处:if判断中,虽然没有体现出Employee类,但是要进行比较操作,要么执行一个转换成string的操作,要么通过一个转换构造函数得到一个string,这两种方法都会产生临时对象导致对string或Employee的operator=调用
  • 第五处:return语句,产生一个临时的空string对象,更好的做法是声明一个局部string保存返回值,再return这个string对象,这样编译器可以启动返回值优化处理来省略局部对象。但绝对不要返回临时对象的引用
string FindAddr(const list<Employee>& l,const string& name)
{
    string addr;
    for (list<Employee>::const_iterator i = l.begin(); i != l.end(); ++i)
    {
        if ( (*i).name == name)
        {
            addr = (*i).addr;
            break;
        }
    }
    return addr;
}

相关文章

网友评论

    本文标题:【Exceptional C++(4)】临时对象

    本文链接:https://www.haomeiwen.com/subject/yoziaxtx.html