我正在编写对性能敏感的代码,它真的要求我强制某些函数调用内联。
对于通过标题在翻译单元之间共享的内联函数,通常必须将函数定义放在头文件中。我不想那样做。其中一些函数在复杂的数据结构上运行,不应在标题中公开。
我已经解决了这个问题,只需将所有.h和.c文件一次性地包含在一个单独的.c文件中,这样只有一个翻译单元。 (这会减慢重新编译的速度,但不足以解决问题。)
这将是“问题解决”,但它消除了当一个C文件中的函数调用另一个应该是私有的C文件中的函数时出错,并且我想在这种情况下得到错误。所以,我有一个单独的Makefile条目进行“正常”构建,只是为了检查这种情况。
为了强制声明内联的函数在“普通”构建中很好地运行,我实际上定义了一个宏may_inline,它用于内联属性通常的位置。对于正常构建,它被定义为空,并且被定义为优化构建的“内联”。
这似乎是一个可以接受的解决方案。我能看到的唯一缺点是我不能在具有相同原型的不同.c文件中拥有私有函数,但到目前为止,这对我来说并不是一个问题。
另一个可能的解决方案是使用GCC's Link-Time Optimization,它应该允许跨翻译单元内联。不过,这是一个新功能,我不相信它总是按照我想要的方式内联。此外,我只能解决一些琐碎的问题,而不是我的实际代码。
这是一个可以接受的黑客,还是我做了一些非常愚蠢的事情?事我以前从未见过这件事让我有点紧张。
答案 0 :(得分:0)
统一构建是绝对有效的方法,并且从一开始就被广泛用于工业中(例如,参见this post)。 Visual Studio的最新版本甚至为它们提供了builtin support。
LTO的缺点是即使在同一平台的编译器之间也无法移植。