You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unix系统中size命令为何未展示可执行及目标文件的堆、栈段?

为什么Unix的size命令不显示heap和stack段的大小?

先看你给出的size命令输出示例:

$ size hello_world-1 hello_world-1.o
text    data     bss     dec     hex filename
  916     256       4    1176     498 hello_world-1
   48       0       0      48      30 hello_world-1.o

要搞懂为什么size不列出heap和stack,得先弄明白两个核心点:size的统计范围,以及heap/stack和text/data/bss的本质区别。

首先,size只统计磁盘文件里的静态固定段

size命令的作用是读取可执行文件或目标文件的ELF(Executable and Linkable Format)头信息,统计那些在编译链接阶段就已经确定大小、并且在磁盘上有对应存储(或明确大小记录)的段:

  • text段:存放程序的机器指令代码,编译完成后大小就固定了,磁盘上直接存储这些指令;
  • data段:存放已经初始化的全局变量、静态变量,它们的初始值在编译时就确定,磁盘上会占用对应空间;
  • bss段:存放未初始化的全局变量、静态变量,编译时只记录它需要的内存大小,磁盘上不占空间,但程序加载时系统会为它分配内存。

这些段的信息都写在二进制文件的ELF头里,size可以直接读取计算。

而heap和stack是运行时才动态存在的内存区域

heap和stack完全是程序运行起来之后由操作系统分配的动态内存,在磁盘上的可执行文件里根本没有对应的段信息:

  • stack:用于存储函数调用栈帧、局部变量等,它的初始大小由操作系统默认设定(比如Linux下可以用ulimit -s查看默认栈大小),运行时会根据函数调用深度动态增长(有上限),磁盘文件里不会记录这个段的信息;
  • heap:用于动态内存分配(比如malloc、new这类操作),它的大小完全是程序运行过程中根据需求向系统申请的,启动时只有一个初始预留空间,后续可以动态扩展,同样不会在磁盘的可执行文件里留下固定大小的记录。

简单来说,size只负责统计“磁盘上的文件里已经有的东西”,而heap和stack是程序跑起来之后才生成的“临时内存区域”,不属于磁盘文件的一部分,自然不会出现在size的输出里。

内容的提问来源于stack exchange,提问作者Kamal Pandey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 02:23:34