美文网首页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