全局变量初始化优化

问题描述:

默认情况下,全局变量初始化为“0”。全局变量初始化优化

当我为其明确赋值“0”时,它会产生多少差异(如果有的话)。

它们中的任何一个是更快/更好/更优化?

我尝试了一个小样本.c程序,但我没有看到可执行文件大小的任何变化。

编辑:0我只是想了解行为。它对我来说不是什么瓶颈。

+3

这是一个微型优化,我不关心自己。这是不太可能有任何明显的变化(如果有的话)。 – JaredPar 2012-03-12 18:29:06

+0

如果您在两个可执行文件之间做了差异,您应该看到它们完全相同。 – 2012-03-12 18:31:48

的回答你的问题是非常具体实施,但通常所有未初始化的全局变量和静态变量在.bss段结束。显式初始化变量位于其他一些data segment中。在执行main()之前,这两项都将被程序加载器复制。因此,在显式初始化为零和保留变量未初始化之间不应该有任何性能差异。

IMO最好将全局变量和静态变量初始化为零,因为它清楚地表明初始值为零。

+0

非常感谢您的详细解答。 – hari 2012-03-12 18:49:17

+0

如何检查.bss和数据段?看看里面有什么? – hari 2012-03-13 20:37:58

+0

@hari告诉你的链接器生成一个地图文件,它将列出各个部分 – Praetorian 2012-03-13 20:47:23

我怀疑是否存在差异,但即使存在这样的差异,我仍然怀疑您的程序是如此优化以至于存在瓶颈。

我宁愿建议您不要在乎所有这些类型的问题,并随意编写代码,也许让位于可读性而不是速度,只留下优化作为最终问题。

过早的优化是所有罪恶

当你说了优化,我假设你的意思是在执行速度更快的根源。如果是这样,那么就不会有任何区别。编译器甚至可能会删除全局变量的初始化(编译器内部不确定)。如果你的意思是程序的空间利用率 - 那也不会有什么不同。

更大的问题是,是否有一个特定的原因,你试图通过初始化全局变量来优化。你能多解释一下吗?

没有。优化器将其视为无操作。

显式初始化对于未经训练的眼更为详细和清晰。如果你的团队中有后辈,我会明确地初始化这些变量。

没有显式初始化器的静态对象在启动时被初始化为零。无论是否将对象明确初始化为0,性能可能没有差别,因为编译器通常在main之前一次初始化所有零对象。

// File scope 
// Same code is likely to be generated for the two objects initialization 

int bla1; 
int bla2 = 0; 

在另一方面,如果分配0,而不是初始化,它可以有所作为,因为编译器不能推断出是什么物体的前值。

void init(void) 
{ 
    bla1 = 0; 
    bla2 = 0; 
}