GCC 有办法指定是否在调用站点内联吗?

Jos*_*vin 5 c++ gcc compilation g++ inline

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

对于 noinline,我可以使用 noinline 属性将调用包装在 lambda 中,并立即调用 lambda。对于展平,我可以将函数包装在模板函数中,该模板函数具有调用底层函数的真/假特化,一个具有展平,一个没有。

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

Amb*_*jak 3

您可以将原始函数定义为 inline with attribute always_inline,然后使用 attribute 定义另一个函数来noinline调用前者(noinline如果您仍想允许内联,则可以不定义)。当您希望内联调用时调用第一个函数,否则调用第二个函数。

示例(神螺栓):

#include <stdio.h>

__attribute__((always_inline))
inline void function_inlined()
{
    puts("Hello");
}

__attribute__((noinline))
void function()
{
    return function_inlined();
}

void test()
{
    function_inlined();
    function();
}
Run Code Online (Sandbox Code Playgroud)