GCC是否有一种方法来指定是否在调用站点内联?

Does GCC have a way to specify whether to inline at the call site?

本文关键字:是否 调用 站点 方法 GCC 一种      更新时间:2023-10-16

GCC有函数属性always_inline, noinline和flatten,它们允许您在定义函数时控制内联行为。我想知道是否有一种方法可以自定义内联行为,其中函数被称为,而不是像属性通常那样为它设置全局内联行为。

对于noinline,我可以使用noinline属性将调用包装在lambda中,并立即调用lambda。对于flatten,我可以将函数包装在具有true/false特化的模板函数中,该特化函数调用底层函数,一个带flatten,一个不带flatten。

但是对于always_inline,我没有这样的hack。存在吗?要明确的是,我希望能够说对f()的特定调用应该内联,而不是使其始终在任何地方内联。

您可以将原始函数定义为具有属性always_inline的内联函数,然后定义具有属性noinline的另一个函数,该函数调用前者(如果您希望仍然允许内联,则不使用noinline)。如果希望内联调用,则调用第一个函数,否则调用第二个函数。

(godbolt)例子:

#include <stdio.h>
__attribute__((always_inline))
inline void function_inlined()
{
    puts("Hello");
}
__attribute__((noinline))
void function()
{
    return function_inlined();
}
void test()
{
    function_inlined();
    function();
}