GCC具有函数属性always_inline,noinline和flatten,可让您在定义函数时控制内联行为。我想知道是否有一种方法可以自定义内联行为,其中函数被称为,而不是像通常那样设置它的全局内联行为。
对于noinline,我可以使用noinline属性在lambda中包装一个调用,并立即调用lambda。对于flatten,我可以将函数包装在一个模板函数中,该函数具有调用底层函数的true / false特化,一个是flatten,另一个是without。
但是对于always_inline我没有这样的黑客。有人存在吗?为了清楚起见,我希望能够说明应该对f()
的特定呼叫进行内联,而不是让它始终在任何地方内联。
答案 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();
}