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