全局变量初始化优化

时间:2012-03-12 18:25:35

标签: c optimization global-variables

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

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

其中任何一个是更快/更好/更优化吗?

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

编辑:0 我只是想了解这种行为。它在任何方面都不是我的瓶颈。

5 个答案:

答案 0 :(得分:5)

您的问题的答案是特定于实现的,但通常所有未初始化的全局和静态变量最终都在.bss段中。显式初始化的变量位于其他data segment中。在执行main()之前,这两个都将被程序加载器复制。因此,显式初始化为零,并且保持变量未初始化之间不应存在任何性能差异。

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

没有显式初始化程序的静态对象在启动时初始化为零。无论是否将对象显式初始化为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;
} 

答案 3 :(得分:1)

我怀疑是否存在差异,但即使存在差异,我也更加怀疑你的程序是如此优化以至于瓶颈就是这样。

我宁愿建议不要关心所有这类问题并编写你喜欢的代码,也许让位于可读性而不是速度,只将优化作为最终问题。

过早优化是所有邪恶的根源

答案 4 :(得分:1)

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

显式初始化对于未经训练的眼睛来说更加冗长和清晰。如果您的团队中有青少年,我会明确初始化这些变量。