Header Implementations和用于优化的内联关键字
Header Implementations And The inline keyword for Optimization
我正在处理一个项目,该项目的头文件中有大量的代码。如果我使用的是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文件实现一次。然后看装配。没有区别。
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- 空基优化子对象的地址
- C++中的"inline"关键字
- 如何确保C++函数在定义之前声明(如override关键字)
- 关闭||运算符优化
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 返回值优化:显式移动还是隐式
- 人脸跟踪arduino代码的优化
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 纯函数,为什么没有优化
- 谷歌模拟和覆盖关键字
- 为什么大多数 pair 实现默认不使用压缩(空基优化)?
- 如何以优化的方式同时迭代两个间距不相等的数组
- 小字符串优化(调试与发布模式)
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- 如果所有派生类在编译时都是已知的,那么final关键字是否提供了优化
- c++ 中的 final 关键字是否允许额外的编译器优化
- Header Implementations和用于优化的内联关键字
- C++“内联”关键字和编译器优化
- C和c++中的优化关键字是否合理?