Effective C++ - 条款4 - 使用前先初始化(构造函数和static初始化顺序有依赖关系)

记忆所有的初始化规则非常困难,所以手动初始化

不要搞混初始化和赋值

  1. 在构造函数中使用赋值操作的是赋值,不是初始化。对于非内置数据类型,这个赋值操作还得先调用他们自己的default构造函数,再进行赋值。效率会很低。因此在当前构造函数中直接使用初始化列表会是最优解,效率高,因为初始化列表直接完成了初始化,避免了额外的一步default构造函数。
  2. 如果想调用default构造,可以把初始化列表中的行参设为空
  3. 而且const和reference不能被赋值,必须初始化,因此采用初始化列表最好
  4. 初始化列表的顺序最好和变量的声明顺序一致,避免产生误解,代码风格比较好看

不同编译单元内定义non local static 对象

  1. static的(非stack和heap):global对象/namespace内对象/classes内对象/函数内对象/file作用域内static对象
  2. local static vs non-local static: 函数内的是local static(对于函数来说是local的)
  3. 问题:如果多个编译单元的non-local static对象之间存在初始化顺序依赖,如何解决?
  4. 方法:Singleton设计。将non-local static转移到函数内,变成local static对象,然后函数返回一个指向这个local static对象的引用。外部通过调用函数来访问这些local static对象。
    这样可以确保调用函数时,该local static对象已经被初始化了(并且只有第一次调用才初始化)。而且只要你不调用,就不会有构造成本。而且这种函数一般都可以inline。
  5. 额外:多线程环境中,non-const static对象,无论local/non-local都可能有坑。解决方法是:在单线程启动阶段,把所有这些函数调用一遍。
posted @ 2022-09-12 11:42  ijpq  阅读(19)  评论(0编辑  收藏  举报