strchr函数用法_c++ strchr函数_strchr函数原型(5)

电脑杂谈  发布时间:2017-02-28 18:06:59  来源:网络整理

// 低效的实现
for (int i = 0; i < 1000000; ++i) {
    Foo f;                  // 构造函数和析构函数分别调用 1000000 次!
    f.DoSomething(i);
}
在循环作用域外面声明这类变量要高效的多:

Foo f;                      // 构造函数和析构函数只调用 1 次
for (int i = 0; i < 1000000; ++i) {
    f.DoSomething(i);
}
静态和全局变量:禁止使用class类型的静态或全局变量:它们会导致很难发现的bug和不确定的构造和析构函数调用顺序.

静态生存周期的对象,包括全局变量,静态变量,静态类成员变量,以及函数静态变量,都必须是原生数据类型(POD:Plain Old Data):只能是int,char,float,和void,以及POD类型的数组/结构体/指针.永远不要使用函数返回值初始化静态变量;不要在多线程代码中使用非const的静态变量.

不幸的是,静态变量的构造函数,析构函数以及初始化操作的调用顺序在C++标准中未明确定义,甚至每次编译构建都有可能会发生变化,从而导致难以发现的bug.比如,结束程序时,某个静态变量已经被析构了,但代码还在跑--其它线程很可能--试图访问该变量,直接导致崩溃.

所以,我们只允许POD类型的静态变量.本条规则完全禁止vector(使用C数组替代),string(使用constchar*), 及其它以任意方式包含或指向类实例的东东,成为静态变量.出于同样的理由,我们不允许用函数返回值来初始化静态变量.

如果你确实需要一个class类型的静态或全局变量,可以考虑在main()函数或pthread_once()内初始化一个你永远不会回收的指针.

yospaly译注:上文提及的静态变量泛指静态生存周期的对象,包括:全局变量,静态变量,静态类成员变量,以及函数静态变量.

译者(YuleFox)笔记:

(1)、cc中的匿名名字空间可避免命名冲突,限定作用域,避免直接使用using关键字污染命名空间;

(2)、嵌套类符合局部使用原则,只是不能在其他头文件中前置声明,尽量不要public;

(3)、尽量不用全局函数和全局变量,考虑作用域和命名空间限制,尽量单独形成编译单元;

(4)、多线程中的全局变量(含静态成员变量)不要使用class类型(含STL容器),避免不明确行为导致的bug.

(5)、作用域的使用, 除了考虑名称污染, 可读性之外, 主要是为降低耦合, 提高编译/执行效率.

3.类:

类是C++中代码的基本单元.显然,它们被广泛使用.本节列举了在写一个类时的主要注意事项.

构造函数的职责:构造函数中只进行那些没什么意义的(trivial,YuleFox注:简单初始化对于程序执行没有实际的逻辑意义, 因为成员变量“有意义”的值大多不在构造函数中确定)初始化,可能的话,使用Init()方法集中初始化有意义的 (non-trivial)数据.

定义:在构造函数体中进行初始化操作.

优点:排版方便,无需担心类是否已经初始化.

缺点:在构造函数中执行操作引起的问题有:

(1)、构造函数中很难上报错误, 不能使用异常.

(2)、操作失败会造成对象初始化失败,进入不确定状态.

(3)、如果在构造函数内调用了自身的虚函数,这类调用是不会重定向到子类的虚函数实现.即使当前没有子类化实现,将来仍是隐患.

(4)、如果有人创建该类型的全局变量(虽然违背了上节提到的规则),构造函数将先main()一步被调用,有可能破坏构造函数中暗含的假设条件.例如, gflag 尚未初始化.


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-35033-5.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...