GCC 是否有办法指定是否在调用站点内联?
Does GCC have a way to specify whether to inline at the call site?
GCC 具有函数属性 always_inline、noinline 和 flatten,可让您在定义函数时控制内联行为。我想知道是否有一种方法可以自定义调用函数的内联行为,而不是像属性通常那样为其设置全局内联行为。
对于 noinline,我可以使用 noinline 属性将调用包装在 lambda 中并立即调用 lambda。对于展平,我可以将函数包装在一个模板函数中,该函数具有 true/false 调用底层函数的特化,一个有展平,一个没有。
但是对于 always_inline 我没有这样的技巧。一个存在吗?明确地说,我希望能够说对 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();
}
GCC 具有函数属性 always_inline、noinline 和 flatten,可让您在定义函数时控制内联行为。我想知道是否有一种方法可以自定义调用函数的内联行为,而不是像属性通常那样为其设置全局内联行为。
对于 noinline,我可以使用 noinline 属性将调用包装在 lambda 中并立即调用 lambda。对于展平,我可以将函数包装在一个模板函数中,该函数具有 true/false 调用底层函数的特化,一个有展平,一个没有。
但是对于 always_inline 我没有这样的技巧。一个存在吗?明确地说,我希望能够说对 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();
}