Header Implementations和用于优化的内联关键字

Header Implementations And The inline keyword for Optimization

本文关键字:关键字 优化 Implementations 用于 Header      更新时间:2023-10-16

我正在处理一个项目,该项目的头文件中有大量的代码。如果我使用的是Visual Studio,这不会是一个问题,因为它有预编译的头等,但这是Linux GCC代码。

无论如何,它开始成为一个编译时间的问题。当然,模板必须保留在头等中,但这些代码中的大部分可以提取到实现文件中,并作为静态库进行链接。所有的项目都使用这些头,每次都进行编译,所以创建一个静态lib是有意义的。

头文件中的实现是内联的,还是这只是一个提示,就像内联关键字一样?这段代码非常耗时,我担心将实现从标题中移出。如果我使用inline关键字而不是在头文件中实现,我能实现同样的事情吗?

**更新**我知道内联只是编译器的一个提示。我不能控制项目中的所有内容,我只想在不影响性能的情况下将所有内容从标题移到库中。这真的会是一个试试看的东西吗?我只想保持性能完全相同,但提高编译时间。

inline关键字只是编译器希望内联该函数的一个提示。其真正的目的是允许您合法地"违反"一个定义规则。

为了内联函数,它的主体必须在调用时可见,这通常意味着如果将函数移动到实现文件,它可能不再内联。

但请记住,头中最有可能的大型函数无论如何都不会内联。还要考虑,在许多情况下,由于各种特定于体系结构的问题,内联函数实际上可能比调用函数慢。

inline是一个优化提示,但它也用于解决ODR问题。

考虑使用整个程序优化/链接时间优化。它允许您在多个文件中实现,基本上所有内容都有相同的机会进行优化(和内联),就好像它在同一个翻译单元中一样。

您的编译时间会变得更快,但链接时间通常会受到影响,有时会有相当大的影响。不过,您不需要为调试构建启用它,因此它可以立即改善开发时间。

如果我使用的是Visual Studio,这不会是一个问题,因为它有预编译的头等

GCC也有。

http://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html

inline关键字并不意味着函数必须在定义函数的"行"中实现。正如你所知,这是对编译器的一个提示,让它尝试编译,就好像函数中的几行就在你调用它的地方一样。这样就避免了保存地址以跳回、vtable查找等的麻烦。

认为它被调用得更快是因为它在标题中,这是(对编写代码的原始人的)一厢情愿的想法。

尝试一下,在一个最小的例子中将实现移动到cpp文件中-main一个对象一个内联函数一个调用。在头中实现一次,在cpp文件实现一次。然后看装配。没有区别。