zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    6个laravel常用目录路径函数
    Laravel上传产品图片Uploading img
    Laravel删除产品-CRUD之delete(destroy)
    Laravel编辑产品-CRUD之edit和update
    Laravel展示产品-CRUD之show
    Laravel创建产品-CRUD之Create and Store
    内存泄露从入门到精通三部曲之排查方法篇
    P问题、NP问题、NPC问题、NP难问题的概念
    二维码的生成细节和原理
    一分钟认识GitHub
  • 原文地址:https://www.cnblogs.com/a3192048/p/12241292.html
Copyright © 2011-2022 走看看