【发布时间】:2012-11-27 09:22:38
【问题描述】:
编译时:
// external definitions
int value1 = 0;
static int value2 = 0;
gcc 编译器生成以下程序集:
.globl value1
.bss
.align 4
.type value1, @object
.size value1, 4
value1:
.zero 4
.local value2
.comm value2,4,4
但是,当我将变量初始化为非零值时,例如:
// external definitions
int value1 = 1;
static int value2 = 1;
gcc 编译器生成以下内容:
.globl value1
.data
.align 4
.type value1, @object
.size value1, 4
value1:
.long 1
.align 4
.type value2, @object
.size value2, 4
value2:
.long 1
我的问题是:
- 为什么在第一种情况下,值分配在 bss 段中,而在第二种情况下,分配在数据段中。
- 为什么 value2 变量在第一种情况下被定义为 .local 和 .comm,而在第二种情况下却没有。
【问题讨论】:
-
很难从您的 C 代码 sn-p 中分辨出来,但
value1似乎是一个全局变量(而不是本地变量)。将在堆栈上分配一个局部变量。 -
很难说。我会考虑将它放入
.bss一个错误中。虽然与标准的观点没有区别(未初始化的变量应该初始化为0),但使用0的初始化与未初始化是不同的。 -
@Codo 我的 sn-ps 中的两个变量定义都是外部定义而不是本地变量。
-
@lefty:你的意思是它们是在文件范围内定义的。 (与块范围、函数范围等相反)内部/外部是具有特定定义的技术术语,具有其他含义。
-
@glglgl:但是说将零初始化数据放入
.bss是一个错误是错误的。当然,在某些系统上,您可以强制编译器以不符合标准的方式运行,但这并不真正相关。