我有一个有很多实用功能的大班。这些功能非常小,我希望它们内联。
问题是它们都在源文件中并且应该保留在源文件中而不是移动到头文件中(所以每次更改时我都不需要重新编译所有内容)。
如果我将它们标记为内联我
未找到符号
有没有办法让它们内联或我是否需要盲目信任链接时优化器?
我需要在clang 3和gcc 4.6之间移植代码,但基于编译器的#define
是可以的(所以只在其中一个编译器中回答如何做到这一点也很好。)
答案 0 :(得分:5)
[这些]功能非常小,我希望它们内联。 [但]我不想[每次改变时重新编译所有内容。
你不能拥有这两件事。如果函数是内联的,那么没有选择,但在更改时重新编译所有调用者。这就是内联工作的方式。即使您使用链接时优化器在链接时自动执行,您仍然需要支付重新处理所有调用者的编译时间成本。
AFAIK顺便说一句,gcc 4.6和clang 3都没有链接时优化器。
编辑方面:我所知道的编译器没有足够的启发式方法来进行手动inline
注释。甚至我在评论中提到的VS2010作为链接时优化器的一个例子 达到了划痕,仍然需要关于内联内容的相当多的建议。
答案 1 :(得分:4)
将实现放在.inl
文件中。只有必要的.cpp
个文件#include
。这种方式更改为实现(touch .inl文件)触发器仅重新编译依赖的.cpp文件。对定义的更改(触摸.h文件)会触发重新编译使用该声明的所有文件。
这是内联函数和模板实现的常见做法。 .inl文件应该基本上被视为'包含cpp'文件。
答案 2 :(得分:4)
如果您希望函数为inline
,则必须将其放在头文件中,除非它仅在同一源文件中使用。原因是编译器需要实际的函数定义,以便将定义“内联”放置在它被调用的任何地方,然后进行编译。
答案 3 :(得分:2)
您需要强制内联函数 - 将其放在类定义中。
答案 4 :(得分:1)
一个选项可能是将内联函数放在预编译的头文件中,这将加快编译速度。但由于内联函数的性质,所有使用它们的地方都必须重新编译。