Visual c++ 为什么使用链接器选项/DYNAMICBASE会加快我的应用程序的速度?

Visual c++ 为什么使用链接器选项/DYNAMICBASE会加快我的应用程序的速度?,visual-c++,linker,Visual C++,Linker,目前,我使用一个简单的应用程序进行了一些速度测量,在此过程中,我注意到,当我告诉链接器使用/DYNAMICBASE时,运行时间大约缩短了1.5% 我同意1.5%在测量过程中很容易出错,但实际上我使用/DYNAMICBASE运行了15次以上,使用/DYNAMICBASE运行了15次:不,每次运行大约5分钟。即使是最快的/DYNAMICBASE:NO运行速度也比最慢的/DYNAMICBASE运行速度快…如果您的解决方案直接或间接使用许多DLL,则/DYNAMICBASE可以减轻windows加载程序

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


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

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

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

如果您看到许多DLL避免使用/DYNAMICBASE重定基址,这可能是原因。您可以(原则上应该)使用/base直接控制基址,而不是将这一优势留给偶然