编译器是否可以生成代码以在执行期间卸载部分代码段?

Poo*_*ria 6 c++ compiler-construction segment

除了在运行时提供加载/卸载方法或函数的能力的Dll概念之外,我想知道编译器是否会说出类似的东西,好吧,因为代码段的这个特定部分占用了相当大的空间并且是在程序执行过程中,在此之后永远不会再次使用,在程序执行期间到达该特定点之后生成一些代码来卸载代码段的那部分是很好的,这样代码段占用的整体空间就会变小.它是虚构的还是可能发生的?

Joe*_*ite 5

当然。有一种称为覆盖的技术,可以在不同的时间将不同的代码加载到地址空间的同一位。有时是手动完成的,其他时候编译器提供了帮助。有时,加载是通过软件完成的,有时是通过硬件(通过地址多路复用)完成的,例如,在引导期间,从ROM芯片读取了一点地址空间,但在引导之后,它切换到了地址RAM或其他ROM。

当计算机的内存较少时,例如在DOS初期,您最多只能有640K,而通常甚至没有,因此覆盖更为常见。如今,它仍然适用于内存和/或地址空间非常宝贵的嵌入式系统。


pax*_*blo 3

编译器可以做任何它想做的事,只要不违反标准。如果它能够确定该代码永远不会再次被调用,它就可以完全放弃它。

如果需要的话,它甚至可以用一个更小的存根函数来替换它,该存根函数可以重新加载代码。

但您不太可能在现代操作系统中看到这一点,因为操作系统本身在幕后提供了该功能。

当内存不足时,操作系统(至少是常见的操作系统)将交换物理页面,并且直到需要时才会重新加载它们(通常是在尝试访问它们时出现页面错误)。