gcc 手册的这一部分非常晦涩,经过反复尝试,我无法理解 forceinline 属性的用法。
我正在定义一个对象和某些函数来操作该对象。这些函数中很少有可以使用原子指令,我希望编译器内联这些函数。但是我不想在头文件中编写这些函数并像在 linux 内核中那样使用“静态内联”声明它们。
有没有办法强制 gcc 从另一个翻译单元内联函数?
您可以使用该always_inline
属性,例如:
void foo () __attribute__((always_inline));
从文档
always_inline 通常,除非指定优化,否则函数不会内联。对于声明为内联的函数,即使未指定优化级别,此属性也会内联函数。
注意1inline
:如果使用always_inline
属性,则无需使用
注意2:如果函数不能被内联,你会得到一个警告,例如,如果在编译时定义不可用,但是,在更高的优化下,gcc 仍然可以将它内联到调用者中,也有一个特定的开关:
-funit-at-a-time
从文档:
优化级别 -O2 及以上,特别是启用一次单元模式,这允许编译器在编译函数时考虑从文件中的后续函数获得的信息。在一次单元模式下一次将多个文件编译为单个输出文件允许编译器在编译每个文件时使用从所有文件中获得的信息。
注意3:不需要显式原型,因此您可以在函数定义中使用属性:
__attribute__((always_inline)) void foo() {
//some code
}
另请参阅此讨论,它回答了您的一些问题。