这是一个非常简单的问题:
在运行时初始化全局变量和静态变量是否有任何性能损失(尽管非常小)?
不可以,因为c++(和C)标准规定所有未由程序员显式初始化的全局/静态变量必须初始化为零。这些变量被放置在一个叫做.bss
的特殊段中。它们在main()被调用之前被初始化为零。
如果你显式初始化你的global/static,但值为0,编译器足够聪明地意识到这一点,仍然把它放在bss
段。
你可以用下面的例子自己测试一下:
#include <stdio.h>
static int uninit;
static int init_zero=0;
static int init_one=1;
int main (void)
{
printf("%pn", &uninit);
printf("%pn", &init_zero);
printf("%pn", &init_one);
return 0;
}
在这个例子中,uninit
和init_zero
变量将在相邻的内存地址结束(可能彼此相距4字节),因为它们都在.bss
段中。但是init_one
变量将完全在其他地方结束,因为它是在.data
段中分配的。
将问题从0初始化(只是的子集)扩展到默认初始化,我们仍然可以得出结论,它通常对应用程序性能没有可衡量的影响。然而,很容易设计一个类,例如,在它的构造函数中进行数据库查找,从而在应用程序启动时产生有趣的效果。