全局变量0初始化惩罚

时间:2015-10-14 13:33:53

标签: c++

这是一个非常简单的问题:

0初始化全局变量和静态变量是否在运行时有任何性能损失(尽管非常小)?

2 个答案:

答案 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;
}

在此示例中,uninitinit_zero变量将最终位于相邻的内存地址(可能彼此相距4个字节),因为它们都位于.bss段中。但init_one变量完全会在其他地方结束,因为它是在.data段中分配的。

答案 1 :(得分:-2)

将问题从0初始化(只是其中的一个子集)扩展到默认初始化,我们仍然可以得出结论,它通常对应用程序性能没有可测量的影响。但是,很容易设计一个类,例如,在它的构造函数中进行数据库查找 - 从而在应用程序启动期间引起有趣的效果。