编译以下代码时:
// 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段,而在第二个案例中,值被分配到data段。
- 为什么在第一个案例中,value2变量被定义为.local和.comm,而在第二个案例中没有。
value1
似乎是一个全局变量(而不是局部变量)。局部变量将分配在堆栈上。 - Codo.bss
中是一个错误。虽然从标准的角度来看没有区别(未初始化的变量应该被初始化为0
),但已经习惯了将初始化为0
与未初始化区分开来。 - glglgl.bss
中的数据已经被初始化。它被初始化为零。现代系统没有提供一种创建未初始化内存的方法。 - Dietrich Epp