全局变量0-initialized惩罚

Global variable 0-initialized penalty

本文关键字:惩罚 0-initialized 全局变量      更新时间:2023-10-16

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

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

不可以,因为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;
}

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

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