2

我目前使用一个简单的应用程序进行了一些速度测量,在此过程中,我注意到当我告诉链接器使用 /DYNAMICBASE 时,运行时间缩短了大约 1.5%。

我同意 1.5% 很容易在测量过程中出现错误,但我实际上使用 /DYNAMICBASE 运行了超过 15 次,使用 /DYNAMICBASE:NO 运行了 15 次以上,每次运行大约 5 分钟。甚至 /DYNAMICBASE:NO 运行中最快的速度都不比最慢的 /DYNAMICBASE 运行速度快...

4

1 回答 1

1

如果您的解决方案直接或间接使用许多 DLL - /DYNAMICBASE 可以减轻 Windows 加载程序的一些负担,尤其是在应用于依赖 DLL 时。当使用的二进制文件被加载并放置在进程地址空间中时,如果它们的默认基地址范围发生冲突 - Windows 加载程序必须重新设置它们的基址,即确定新的基地址并遍历 DLL 全局符号调用(数据或函数)并更改它们到新地址。对于许多或非常大的 DLL,这可能会对启动时间产生不可忽视的影响。

如果您从调试器运行,您可以在“模块”窗口中查看加载的二进制文件,并检查左侧的图标以确定模块是否经历了变基:

模块窗口

如果您看到许多 DLL 避免使用 /DYNAMICBASE 进行变基,这可能是原因。您可以(并且原则上应该)使用 /BASE 直接控制基地址,而不是把这个好处留给机会。

于 2015-09-06T09:41:17.913 回答