zoukankan      html  css  js  c++  java
  • 读书笔记_Effective_C++_条款二十六:尽可能延后变量定义式的出现时间

    这个条款从字面意思还是很好理解的,就是在使用这个变量前才去定义,而不是很早就定义了它,而在很后面的时候才去使用。这个条款只适用于对变量声明位置没有要求的语言,比如C++。对于像C或者一些脚本语言,语法要求变量声明放在函数开始处,这个条款就不能使用了。

    但其实从使用的角度而言,如果不是语法的硬性要求,还是在变量使用前再去定义变量的做法比较好。这有几点原因,最直观的就是可读性比较好,程序员在阅读代码时,看到一个陌生的变量名,不用向上翻好几页才看到它的定义类型,而且对于开发者而言,也不会出现前面定义了一个变量,之后又忘记使用它的情况。另一个原因就是可以节省资源,考虑以下的代码:

    1 void example(const A& parm)
    2 {
    3     A a;
    4     fun(); // 这个fun()函数不会使用a
    5     a = parm;
    6 7 }

    假设存在一个类A,如果在程序的开始处就定义它的对象a(调用了构造函数),中间夹了一个函数fun(),这个函数可能抛出异常,导致下面的程序不去执行,这样对象a的构造函数就白调用了,既浪费了空间,也浪费了时间。

    所以改进的做法就是:

    1 void example(const A& parm)
    2 {
    3     fun();
    4     A a;
    5     a = parm;
    6 7 }

    这下如果fun()抛出异常,那么也不会浪费资源了,但这里还是有一个比较“废”的地方,就是调用了构造函数,也调用了赋值运算,但这两个操作的目的都是给a一个值,所以可以将这两个操作进行精减,直接调用A的拷贝构造函数,像这样:

    1 void example(const A& parm)
    2 {
    3     fun();
    4     A a(parm);
    5 6 }

    赋值运算就不用调用了。

    书上还讲到了一个写代码常见的问题,就是循环中的变量定义,是放在循环内比较好呢,还是放在循环外比较好呢?看下面的例子:

    1 // 放在循环外
    2 A a;
    3 for(int i = 0; i < N; ++i)
    4 {
    5     a = a * b[i];
    6 7 }
    8 //后面不再使用a
    1 // 放在循环内
    2 for(int i = 0; i < N; ++i)
    3 {
    4     A a(b[i]);
    5 6 }
    7 //后面不再使用a

    分析一下,如果采用放在循环外的方法,代价是1次构造+1次析构+N次赋值;如果采用放在循环内的方法,代价是N次构造+N次析构。所以究竟哪个更好,还是要看构造函数、析构函数VS赋值操作,哪一个比较废。

    但如果两方的代价差不多,还是推荐放在循环内的做法,因为这种做法使得a的作用域局限于for循环内,符合作用域能小就小的编程原则。

    最后总结一下:

    尽可能延后变量定义式的出现,这样做可增加程序的清晰度并改善程序效率。

  • 相关阅读:
    Sphere AABB Collision Detaction
    左右手坐标系的差别
    php 利用 soap调用.Net的WebService asmx文件
    NewLife.XCode 上手指南(五) 复杂查询
    NewLife.Xcode 上手指南(三) 扩展属性的使用
    JS获取URL参数
    [转]模态窗口使用总结
    Jquerysimplemodal的使用,弹出窗口,弹出页面
    NewLife.XCode 上手指南(四) 级联操作
    NewLife.XCode 上手指南
  • 原文地址:https://www.cnblogs.com/jerry19880126/p/3162100.html
Copyright © 2011-2022 走看看