程序员的自我修养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

可以看到编译器的行为与书本中所述一致

posted @ 2025-11-11 21:42  Makiras1176  阅读(2)  评论(0)    收藏  举报