我如何告诉链接器使用方法的多个实现中的哪一个?
How can I tell the linker which one of multiple implementations of a method to use?
我使用工具生成了 111k 行长的 C++ class 实现。它生成的方法可以正常工作,但它们往往会在它们使用的 API 中触发一个缓慢的路径。
有没有什么办法,在 Mac OS X 上使用 Clang,我可以在不同的源文件中手动实现一些最常用的方法,并告诉链接器(或任何其他相关程序)忽略工具生成的方法(如果存在该方法的另一个实现)?
我可以完全控制该工具的输出,尽管很难自动生成更好的代码。
工具生成的方法需要标记为弱外部。在 GCC 中,clang this is achieved 和 __attribute__((weak_import))
。然后,如果您手工制作的等价物是强大的外部(默认情况下),它们将优先于生成的。
如果代码是在库中交付的,那么 linker 会在连续的库中搜索 .o 文件,直到满足所有未解析的符号。因此,如果您的代码生成可以确保将弱代码分离到不同的 .cpp 文件中,那么您可以在 link 路径上的早期 .a 中交付自定义编写的版本,该版本将在由提供的 .a 之前使用代码生成。
或者,如果您可以在代码中添加一个错误的模板,那么您可以为代码指定一个明确的专业化。这将由 compiler/linker 使用,因为它是一个特定的专业化。
我使用工具生成了 111k 行长的 C++ class 实现。它生成的方法可以正常工作,但它们往往会在它们使用的 API 中触发一个缓慢的路径。
有没有什么办法,在 Mac OS X 上使用 Clang,我可以在不同的源文件中手动实现一些最常用的方法,并告诉链接器(或任何其他相关程序)忽略工具生成的方法(如果存在该方法的另一个实现)?
我可以完全控制该工具的输出,尽管很难自动生成更好的代码。
工具生成的方法需要标记为弱外部。在 GCC 中,clang this is achieved 和 __attribute__((weak_import))
。然后,如果您手工制作的等价物是强大的外部(默认情况下),它们将优先于生成的。
如果代码是在库中交付的,那么 linker 会在连续的库中搜索 .o 文件,直到满足所有未解析的符号。因此,如果您的代码生成可以确保将弱代码分离到不同的 .cpp 文件中,那么您可以在 link 路径上的早期 .a 中交付自定义编写的版本,该版本将在由提供的 .a 之前使用代码生成。
或者,如果您可以在代码中添加一个错误的模板,那么您可以为代码指定一个明确的专业化。这将由 compiler/linker 使用,因为它是一个特定的专业化。