/ORDER(按顺序放置函数)

指定单独打包 (COMDAT) 函数的链接顺序。

语法

/ORDER:@文件名

参数

filename
指定 COMDAT 函数的链接顺序的文本文件。

注解

/ORDER 编译器选项允许你通过将函数与其调用的函数组合在一起来优化程序的分页行为。 你还可以将经常调用的函数组合在一起。 这些技术(称为交换优化或分页优化)会增加调用函数在内存中所需的概率,而无需从磁盘进行分页。

将源代码编译为目标文件时,可以使用 /Gy(启用函数级链接)编译器选项告诉编译器将每个函数放入其自己的部分(称为 COMDAT)中。 /ORDER 链接器选项告知链接器按照你指定的顺序将 COMDAT 放入可执行映像中。

要指定 COMDAT 顺序,请创建一个响应文件,这是一个按名称列出每个 COMDAT 的文本文件,每行一个,按照你希望它们被链接器放置的顺序。 将此文件的名称作为 /ORDER 选项的 filename 参数传递。 对于 C++ 函数,COMDAT 的名称是函数名称的修饰形式。 对于 C 函数,使用未修饰的名称 main;对于 C++ 函数,则声明为 extern "C"。 函数名称和修饰名称区分大小写。 有关修饰名称的详细信息,请参阅修饰名称

要查找 COMDAT 的修饰名称,请在对象文件上使用 DUMPBIN 工具的 /SYMBOLS 选项。 链接器会自动在响应文件中的函数名称前添加下划线 (_),除非名称以问号 (?) 或 at 符号 (@) 开头。@ 例如,如果源文件 example.cpp 包含函数 int cpp_func(int)extern "C" int c_func(int)int main(void),则 DUMPBIN /SYMBOLS example.obj 命令会列出以下修饰名称:

...
088 00000000 SECT1A notype ()    External     | ?cpp_func@@YAHH@Z (int __cdecl cpp_func(int))
089 00000000 SECT22 notype ()    External     | _c_func
08A 00000000 SECT24 notype ()    External     | _main
...

在这种情况下,请在响应文件中将名称指定为 ?cpp_func@@YAHH@Zc_funcmain

如果链接器选项中出现多个 /ORDER 选项,则最后一个指定的选项生效。

/ORDER 选项禁用增量链接。 如果启用了增量链接,或者指定了 /ZI(增量 PDB)编译器选项,则在指定此选项时,你可能会看到链接器警告 LNK4075。 要消除此警告,可以使用 /INCREMENTAL:NO 链接器选项关闭增量链接,并使用 /Zi(生成 PDB)编译器选项生成不带增量链接的 PDB。

注意

LINK 无法对静态函数进行排序,因为静态函数名称不是公共符号名称。 指定 /ORDER 时,将为订单响应文件中静态或未找到的每个符号生成此链接器警告 LNK4037

在 Visual Studio 开发环境中设置此链接器选项

  1. 打开项目的“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性

  2. 选择“配置属性”>“链接器”>“优化”属性页

  3. 修改“函数顺序”属性以包含响应文件的名称。

以编程方式设置此链接器选项

另请参阅

MSVC 链接器参考
MSVC 链接器选项