• 【C++ Efficiency】找到可能产生“临时对象”的地方


    临时对象

    • 不可见:不会再源代码中出现;
    • temp并不是临时对象,只是函数中的一个局部对象。

    当产生一个non-heap object,而没有为它命名,便会产生了一个临时对象;

    匿名对象通常发生于两种情况:
    一是隐式类型转换被实施起来以求函数调用成功;
    二是函数返回对象的时候。

    为了让函数调用成功而产生的临时对象

    发生于“传递某对象给一个函数,而其类型和它即将绑定上去的参数类型不同”的时候。

    //返回ch在str中出现的次数
    size_t countChar(const string& str,char ch);
     
    char buffer[MAX_STRING_LEN];
    char c;
    
    //读入一个char和一个string,利用setw避免
    //在读入string的时候产生缓冲区溢出的情况。
    cin >> c >> setw(MAX_STRING_LEN) >> buffer;
     
    cout << "There are" << countChar(buffer,c)
    	 << "occurrences of the character" << c_str
    	 <<"in" << buffer <<endl;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    调用countChar时,第一个自变量是一个char数组,但是函数参数确实const string& :

    • 当“类型不吻合”时,编译器便会产生一个类型string的临时对象;
    • 该对象的初始化方式:以buffer作为参数,调用string的构造函数;
    • countChar的str参数会绑定在string临时对象上,当countChar返回,此临时对象自动销毁。

    然而,以上转换,只有当对象以by value(传值)方式传递,或是当对象被传递给一个reference-to-const参数时,这些转换才会发生。如果对象被传递给一个reference-to-non-const参数,并不会发生此类转换,即如果把临时变量作为非const引用参数传递毫无意义。

    //str中所有字符改成大写
    void uppercasify(string& str);
    
    char subtleBookPlug[] = "Effective C++";
    uppercasify(subtleBookPlug); //错误! 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    当函数返回对象时产生的临时对象

    const Number operator+(const Number& lhs,const Number& rhs);
    
    • 1

    这个函数返回值是个临时对象,因为它没有名称:它就是函数的返回值;
    每次调用operator+需要为这个对象的构造和释放操作付出代价。

    总结

    临时对象很耗成本,尽可能消除它们。
    学会寻找临时对象的产生更重要
    在任何地方只要见到常量引用(reference-to-const)参数,就存在建立临时对象而绑定参数的可能。在任何时候只要见到函数返回对象,就会有一个临时对象被建立(然后被释放)。

  • 相关阅读:
    Jmeter性能测试 —— jmeter之使用ServerAgent监控服务器
    【python笔记】第九节 函数进阶
    代码随想录算法训练营第五十一天| LeetCode 121 买卖股票的最佳时机、LeetCode 122 买卖股票的最佳时机II
    计算机毕业设计Java共享顺风车管理系统(源码+系统+mysql数据库+Lw文档)
    决策树介绍
    Unity3d C# 使用Universal Media Player(ump)插件播放视频的众坑之无法播放视频和VLC播放器依赖的问题
    【每日一题】打卡 42
    无线互动会议室方案的视频显示系统
    CSS day_14(6.29) Sass基本规则和语法、云服务器的购买和使用
    mongodb数据同步到hive
  • 原文地址:https://blog.csdn.net/weixin_49347928/article/details/133218086