我正在处理工作中的项目,其中头文件中存在负载和大量代码。如果我使用Visual Studio,这不会是一个问题,因为它有预编译的头文件等,但这是Linux GCC代码。
无论如何,它开始成为编译时的一个问题。当然,模板必须保留在标题等中,但是大部分代码都可以提取到实现文件中并作为静态库链接。所有项目都使用这些头文件并每次都进行编译,因此创建一个静态库是有意义的。
头文件中的实现是内联的,还是只是一个提示,就像内联关键字一样?这段代码非常重要,我担心将这些实现移出标题。如果我使用inline关键字而不是在头文件中实现,我可以实现相同的目的吗?
**更新** 我知道内联只是对编译器的一个提示。我无法控制项目中的所有内容,我只想将标题中的所有内容移动到库中,而不会影响性能。这实际上是尝试它看到的东西?我只想保持性能完全相同,但增加编译时间。
答案 0 :(得分:2)
inline
关键字只是编译器的一个提示,它可能希望内联该函数。其真正的目的是允许您合法地“违反”一个定义规则。
为了内联函数,它的主体必须在调用点处可见,这通常意味着如果将函数移动到实现文件,它可能不再内联。
但请记住,标题中最有可能的大型函数无论如何都不会内联。还要考虑在许多情况下,由于各种特定于体系结构的问题,内联函数实际上可能比调用函数更慢。
答案 1 :(得分:0)
inline
是一个优化提示,但它也用于解决ODR。
考虑使用整个程序优化/链接时优化。它允许您在多个文件中实现,基本上所有内容都有相同的机会进行优化(和内联),就像它们在同一个翻译单元中一样。
您的编译时间变得更快,但链接时间通常会受到影响,有时会相当多。您不需要为调试版本启用它,因此它可以显示开发时间的非常快速的改进。
答案 2 :(得分:0)
海湾合作委员会也有他们。如果我使用Visual Studio,这不会是一个问题,因为它有预编译的标题等
答案 3 :(得分:0)
inline关键字并不意味着必须在您定义函数的“行”中实现该函数。如你所知,它是编译器的一个提示,让它尝试编译,就像函数中的几行在你调用它的地方一样。因此避免了保存地址以进行跳回,vtable查找等等。
认为它更快被调用,因为它在标题中,是一厢情愿的想法(编写代码的原始人)。
尝试并以最小的例子将实现移动到cpp文件 - 主要的一个对象,一个内联函数调用它。一旦在头文件中实现,一次在cpp文件中实现。然后看看装配。没有区别。