取决于您的编译器,是的。对于 g++,以下将起作用:
void foo() __attribute__ ((noinline));
void foo() __attribute__ ((always_inline));
在 MSVC++ 上:
__declspec(noinline) void foo();
__forceinline void foo();
请注意,g++要求属性仅应用于原型,而不是定义。因此,如果您的函数是仅定义的(没有单独的原型),那么您必须创建一个原型才能应用该属性。MSVC 没有这个要求。
__forceinline
具体有一些例外。请务必仔细阅读它们,以便了解它是否会对您的特定情况产生任何影响。g++ 没有记录该always_inline
属性的任何异常,但有些事情是显而易见的(例如,内联对虚拟方法的调用仅在静态调用该方法时才有效)。
您可以使用宏对其进行概括:
#ifdef _MSC_VER
#define NOINLINE(x) __declspec(noinline) x
#define INLINE(X) __forceinline x
#else
#ifdef __GNUC__
#define NOINLINE(x) x __attribute__ ((noinline))
#define INLINE(x) x __attribute__ ((always_inline))
#else
#error "I don't know how to force inline/noinline on your compiler."
#endif
#endif
INLINE(void foo());
NOINLINE(void foo());