12、编译器操作与代码生成:内存、对齐与优化解析

编译器操作与代码生成:内存、对齐与优化解析

1. 可执行文件大小与内存占用差异

可执行文件大小与应用程序运行时的内存占用可能存在显著差异,这主要由内存页分配和内部碎片两个因素导致。

1.1 内存页分配

操作系统在将程序加载到内存时,会按照内存页进行分配。以一个程序为例,若其可执行文件仅 600 字节,但使用了四个不同的内存段,且每个段在内存中占用一个 4KB 的页面,那么该程序在运行时将需要 16384 字节的内存。这是因为底层的内存保护硬件要求操作系统为每个进程分配整页的内存。

1.2 内部碎片

内部碎片是可执行文件小于应用程序运行时内存占用的另一个原因。当必须以固定大小的块来分配内存段,而实际只需要每个块的一部分时,就会产生内部碎片。例如,内存中的每个段都会占用整数个页面,即使该段的数据大小不是页面大小的倍数。从段中最后一个数据或代码字节到该字节所在页面的末尾,所有字节都会被浪费,这就是内部碎片。

一些可执行文件格式允许在不将每个段填充到页面大小的倍数的情况下进行打包。然而,这种方式可能会影响性能,因此一些可执行文件格式不会对段进行打包。此外,可执行文件的大小不包括运行时动态分配的任何数据,如堆上的数据对象和 CPU 栈上的值。所以,应用程序实际消耗的内存可能比可执行文件的大小多得多。

黑客们常常比拼谁能用自己喜欢的语言写出最小的“Hello World”程序,汇编语言程序员尤其喜欢吹嘘他们能用汇编语言写出比 C 或其他高级语言更小的程序。但实际上,无论程序的可执行文件是 600 字节还是 16000 字节,一旦操作系统为程序的不同段分配了四到五个页面,程序在运行时消耗的内存很可能是相同的

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值