程序员的自我修养3.3节笔记
程序员的自我修养原文3.3节中有这么一段
Quiz 变量存放位置
现在让我们来做一个小的测试,请看以下代码:
static int x1 = 0;
static int x2 = 1;
x1和x2会被放在什么段中呢?
x1会被放在.bss中,x2会被放在.data中。为什么一个在.bss段, 一个在.data段? 因为x1为0,可以认为是未初始化的,因为未初始化的都是0,所以被优化掉了可以放在.bss,这样可以节省磁盘空间,因为.bss不占磁盘空间。另外一个变量x2初始化值为1,是初始化的,所以放在.data段中。
但考虑到书本年代略久远,故在本笔记撰写时间点(2025.9),在ubuntu24.04系统上使用较新的编译器重新进行测试,使用到的代码如下:
int printf( const char* format, ... );
static int x;
static int y = 1;
void func1(int i) {
printf("%d\n", i);
}
int main()
{
func1(x + y);
return 0;
}
使用clang-20不进行链接生成目标文件,使用objdump -x -s -d进行查看
2 .bss 00000004 0000000000000000 0000000000000000 0000009c 2**2
ALLOC
3 .data 00000004 0000000000000000 0000000000000000 0000009c 2**2
可以看到编译器的行为与书本中所述一致

浙公网安备 33010602011771号