GCC是否有办法指定是否在呼叫站点内联?

时间:2015-09-14 22:50:59

标签: c++ gcc compilation g++ inline

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

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

但是对于always_inline我没有这样的黑客。有人存在吗?为了清楚起见,我希望能够说明应该对f()的特定呼叫进行内联,而不是让它始终在任何地方内联。

1 个答案:

答案 0 :(得分:2)

您可以将原始函数定义为内联属性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();
}