• C/C++ 循环内还是循环外定义变量更好?


    问:

    // 方法 A:
    Widget w;
    for (int i = 0; i < n; ++i) {
        w = 取决于 i 的某个值;
    }
    
    // 方法 B:
    for (int i = 0; i < n; ++i) {
        Widget w(取决于 i 的某个值);
    }

    Effective C++ 条款 26 有一段话大概是:当一个赋值成本低于一组构造+析构成本,定义在循环外(即A)比较高效,否则定义在循环内(即B)比较好。

    我的问题是:哪些情况 赋值成本低于一组构造+析构成本?

    答:

    我觉得这个更应该思考两种情况下,变量的作用域,这个更为关键。A情况,w的生存周期会在循环外继续存在,而B不会,不要过早的考虑优化的问题,现在的编译器比你想象的还要聪明。

    而对于C++来说,更崇尚RAII(Resource Acquisition Is Initialization),当你要使用时,就直接再声明定义。比如在A情况下,如果我在赋值w前有一段是检测逻辑,如果不满足,我就直接抛出异常,那么你就需要承担构造w的代价,即使它没有用到,如下所示:

    Widget w;
    for (int i = 0; i < n; ++i) {
        if(some condition)
        {
           throw std::exception("haha");
        } 
        w = 取决于 i 的某个值;
    }
    


    然而,对于在使用时再直接声明并定义就不会有这样的问题:

    for (int i = 0; i < n; ++i) {
        if(some condition)
        {
           throw std::exception("haha");
        } 
        Widget w(i);
    }

    这样,即使抛出异常,也不会承担构造无谓的构造w的代码。

    所以,在编写C++代码时,应该忘记C89的先声明,后面再来定义的做法,而是考虑RAII。

    原文链接:循环内还是循环外定义变量? - 蓝色的回答 - 知乎 https://www.zhihu.com/question/36125544/answer/66031885

  • 相关阅读:
    基于傅里叶变换的音频重采样算法 (附完整c代码)
    自动曝光修复算法 附完整C代码
    3D Lut 电影级调色算法 附完整C代码
    之于图片主色调提取算法
    并发中的各种锁
    算法---BitMap
    高级数据结构---堆树和堆排序
    高级数据结构---赫(哈)夫曼树及java代码实现
    域名和服务器绑定及https协议更换
    高级数据结构---B树和B+树及mysql索引分析
  • 原文地址:https://www.cnblogs.com/a3192048/p/12241292.html
Copyright © 2020-2023  润新知