如何使内联函数只占用可执行文件中一个副本的内存空间

有没有一种方法可以在程序中的多个位置创build一个内联函数(当然已经被编译器内联),只占用可执行文件中的内存,就好像它不是内联和/或只是有一个内联实例? 从理论上讲,这应该是可能的,因为函数只需要从内存中加载一次,并且其加载的内容(在RAM和/或高速caching中)将被复制到RAM中的其他必要位置,以便既提高性能又减less在硬盘中采取的空间。 Android是我主要关心的,但是我会很感激听到有关android以外的其他操作系统的答案。

好像你想要一个蛋糕,也吃了。 整个内联点就是把它的功能复制到它所在的地方。

但是,这不应该太担心,因为在许多情况下,内联代码比原始函数小得多,因为它错过了寄存器的保存/恢复,由于它们在编译时被评估等原因而删除了部分代码。如果你的函数比较小,那么实际上可能会产生比实际调用函数的现有副本所需的代码更小的代码。

如果你认为你可能有代码大小的问题,你应该真的发表一些例子,并解释为什么你认为这是一个问题。

目前与您所描述的最接近的是JIT(Just-In-Time)编译,它允许您在高层次(因此可能非常紧凑)编写函数的单个副本,以后可以将其转换为机器码在飞行中。 这是Android的虚拟机做btw。


如果你担心程序加载时间,你可能不应该担心一些功能。 首先,代码将从设备中加载(最有可能)4 KiB页面。 为了减少加载时间,你需要减少至少1页的代码大小,以获得一些改善,否则你不会赢得任何东西。

请记住,数据通常是从非易失性存储器加载一次并保存在OS缓存中,例如在大多数情况下,代码已经在RAM中。

即使你能够达到你想要的(使用某种类型的JIT翻译),你应该记住,在飞行中进行翻译也会花费时间并且需要更多的RAM,因为你将保留原始高级代码和结果机器代码将数据推出缓存,可能会减慢其他程序的加载速度。

整个内联点是它允许编译器根据其他代码改变,专门化和优化函数。 这意味着每个内联的“复制”结束了不同的操作,在不同的寄存器和内存偏移上运行,并且优化了不同的条件分支。 试图使用不同版本的函数,就好像它们是可互换的,只会破坏一切。