零初始化全球数据的位置

时间:2013-05-31 04:10:11

标签: c gcc coding-style static-members

int x = 10;

int y = 0;

int z;

static int m = 0;

这是我的3个全局变量。

我知道__未初始化的全局数据___会进入.BSS段,但是全局数据初始化为 0

将在哪个段中存储变量y和m。

这里有编译器相关的依赖吗?

2 个答案:

答案 0 :(得分:1)

静态分配的全局变量变量ym可以移动到bss部分,这些全局变量用仅由零值位组成的值初始化。这具有编译器依赖性。

编译器可以自由地将这样的变量放入bss以及数据中。

GCC有以下编译器选项来决定:

  

-fno-零初始化功能于BSS

     

如果目标支持BSS部分,则GCC默认将初始化为零的变量放入BSS。这可以节省生成的代码中的空间。上面的选项会关闭此行为。

MSVC具有以下预处理器指令:

  

#pragma bss_seg

答案 1 :(得分:0)

(不是我自己的话)

在C中,没有显式初始值设定项的静态分配对象初始化为零(对于算术类型)或空指针(对于指针类型)。 C的实现通常使用仅由零值位组成的位模式表示零值和空指针值(尽管C标准不要求这样做)。因此, bss部分通常包括在文件范围(即,在任何函数之外)声明的所有未初始化变量以及使用static关键字声明的未初始化的局部变量。 实现还可以将静态分配的变量分配给bss部分,该变量使用仅由零值位组成的值进行初始化。

http://en.wikipedia.org/wiki/.bss

z未初始化,因此它会下注到BSS中。但是你在问题中没有这么说吗?

你和m也可能会去那里。不过,不确定你是否打算询问他们。

然后X将转到数据段。

http://en.wikipedia.org/wiki/Data_segment