编译器操作与代码生成:内存、对齐与优化解析
1. 可执行文件大小与内存占用差异
可执行文件大小与应用程序运行时的内存占用可能存在显著差异,这主要由内存页分配和内部碎片两个因素导致。
1.1 内存页分配
操作系统在将程序加载到内存时,会按照内存页进行分配。以一个程序为例,若其可执行文件仅 600 字节,但使用了四个不同的内存段,且每个段在内存中占用一个 4KB 的页面,那么该程序在运行时将需要 16384 字节的内存。这是因为底层的内存保护硬件要求操作系统为每个进程分配整页的内存。
1.2 内部碎片
内部碎片是可执行文件小于应用程序运行时内存占用的另一个原因。当必须以固定大小的块来分配内存段,而实际只需要每个块的一部分时,就会产生内部碎片。例如,内存中的每个段都会占用整数个页面,即使该段的数据大小不是页面大小的倍数。从段中最后一个数据或代码字节到该字节所在页面的末尾,所有字节都会被浪费,这就是内部碎片。
一些可执行文件格式允许在不将每个段填充到页面大小的倍数的情况下进行打包。然而,这种方式可能会影响性能,因此一些可执行文件格式不会对段进行打包。此外,可执行文件的大小不包括运行时动态分配的任何数据,如堆上的数据对象和 CPU 栈上的值。所以,应用程序实际消耗的内存可能比可执行文件的大小多得多。
黑客们常常比拼谁能用自己喜欢的语言写出最小的“Hello World”程序,汇编语言程序员尤其喜欢吹嘘他们能用汇编语言写出比 C 或其他高级语言更小的程序。但实际上,无论程序的可执行文件是 600 字节还是 16000 字节,一旦操作系统为程序的不同段分配了四到五个页面,程序在运行时消耗的内存很可能是相同的
超级会员免费看
订阅专栏 解锁全文
2466

被折叠的 条评论
为什么被折叠?



