banner

才会发生返转。这就意味着,几乎不会有人能够见证返转发生了。

分辨率不是准确性

tips

在 Windows 上,GetTickCount() 会返回一个无符号的 32 位整数值。如果一个程序在某个操作开始和结束时分别调用了 GetTickCount() ,两个返回值之间的差值就是两次调用之间经过的毫秒单位的执行时间。因此,GetTickCount() 的分辨率是 1 毫秒。

例如,下面这段代码通过在循环中反复调用 Foo() ,在 Windows 上测量了名为 Foo() 的函数的相对性能。通过在代码块开始和结束时得到的时标计数值,我们可以计算出循环处理所花费的时间:

Dream对象(如cout)来处理输出。创建这样的对象将打开一个流,自动创建缓冲区,并将其与流关联起来,同时使得能够使用类成员函数。

重定义I/O

ISO/ANSI C++标准对I/O作了两方面的修订。首先是从ostream.h到ostream的变化,用ostream将类放到std名称空间中。其次,I/O类被重新编写。为成为国际语言,C++必须能够处理需要16位的国际字符集或更宽的字符类型。因此,该语言在传统的8位char(或“窄”)类型的基础上添加了wchar_t(或“宽”)字符类型。每种类型都需要有自己的I/O工具。标准委员会并没有开发两套独立的类量且没有声明任何虚成员函数,但是有些继承类却声明了虚成员函数,那么每个虚成员函数调用都会在 this 指针上加上一个偏移量来得到虚函数表指针的地址。确保在这个基类中至少有一个成员函数,可以强制虚函数表指针出现在偏移量为 0 的位置上,这有助于产生更高效的代码。

而析构函数则是最佳候选。如果这个基类有继承类,它就必须是虚函数。在类实例的生命周期中析构函数只会被调用一次,因此只要不是那些在程序中会被频繁地构造和析构的非常小的类(而且通常情况下,几乎不会让这些小的类去继承子类),将其设置为虚函数后产生的开销是最小的。

这看似是非常罕见的情况,不需要太过关注,不过我参与过的几个项目中都存在