3

我正在编写对性能敏感的代码,这确实需要我强制内联某些函数调用。

对于通过头文件在翻译单元之间共享的内联函数,通常必须将函数定义放在头文件中。我不想那样做。其中一些函数对不应在标头中公开的复杂数据结构进行操作。

我已经解决了这个问题,只需将所有 .h 和 .c 文件都包含在一个 .c 文件中,这样就只有一个翻译单元。(这会减慢重新编译的速度,但还不够重要。)

这将是“解决问题”,但它消除了当一个 C 文件中的函数调用另一个 C 文件中应该是私有的函数时出现错误,并且我想在这种情况下得到一个错误。所以,我有一个单独的 Makefile 条目,它执行“正常”构建,只是为了检查这种情况。

为了强制声明 inline 的函数在“正常”构建中很好地发挥作用,我实际上定义了一个宏 may_inline,它用于 inline 属性通常所在的位置。对于正常构建,它被定义为空,对于优化构建,它被定义为“内联”。

这似乎是一个可以接受的解决方案。我能看到的唯一缺点是我不能在具有相同原型的不同 .c 文件中拥有私有函数,但到目前为止,这对我来说并不是什么大问题。

另一个潜在的解决方案是使用GCC 的 Link-Time Optimization,它应该允许跨翻译单元内联。不过,这是一个新功能,我不相信它总是能按照我想要的方式内联。此外,我只能让它解决琐碎的问题,而不是我的实际代码。

这是一个可以接受的黑客,还是我在做一些非常愚蠢的事情?我以前从未见过这样做的事实让我有点紧张。

4

1 回答 1

0

Unity 构建是一种绝对有效的方法,并且一直以来都在工业中广泛使用(参见例如这篇文章)。最新版本的 Visual Studio 甚至为它们提供了内置支持

LTO 的缺点是即使跨同一平台的编译器也不能移植。

于 2019-01-27T07:38:04.917 回答