GCC是否有一种方法来指定是否在调用站点内联?
Does GCC have a way to specify whether to inline at the call site?
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();
}
相关文章:
- 如何检查在编译时是否调用了模板化方法?
- 通过引用传递对象时是否调用复制构造函数?
- 如何在类中检查是否调用宏
- 传递类 by-value 时,调用方或被调用方是否调用析构函数
- 如何检查是否调用了成员方法
- c++ 运算符 new[]/delete [] 是否调用运算符 new/delete?
- Lvalue和Literal之间的比较是否调用Lvalue到Rvalue的转换
- 编译器如何知道是否调用 const 重载
- stl 优先级队列中的堆管理是否调用复制构造函数
- 此代码是否调用不存在的构造函数?
- 以下 C/C++ 代码是否调用未定义的行为
- Type t=Type()是否调用复制构造函数
- 检查是否调用了复制构造函数
- 以下代码是否调用未定义的行为
- std:map 析构函数是否调用键析构函数以及值析构函数?
- 当我在extern c中创建对象时,是否调用了c++类析构函数
- vector是否调用指向对象的指针的析构函数
- ToUnicode是否调用ToUnicodeEx?ToUnicodeEx在内核空间线程上更改了什么
- 如何在编译时检查是否调用了函数
- unique_ptr::release()是否调用析构函数