2

诠释 x=10;

整数 y=0;

诠释z;

静态int m = 0;

这些是我的 3 个全局变量。

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

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

这里有任何与编译器相关的依赖项吗?

4

2 回答 2

3

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

编译器可以自由地将这些变量放入 bss 和 data 中。

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

-fno-zero-initialized-in-bss

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

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

#pragma bss_seg

于 2013-05-31T04:55:35.500 回答
0

(不是我自己的话)

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

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

z 是未初始化的,所以它会下注放入 BSS。但是你的问题不是这么说的吗?

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

然后 X 将转到数据段。

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

于 2013-05-31T04:12:57.363 回答