选择性内联函数(用于调试目的)?

imr*_*mre 4 c++ inline

我喜欢的是一个构建配置,其中函数没有内联,除了一些选定的函数(可能会或可能不会内联,这取决于编译器).

更好的是某种"内联级别",我可以为每个函数指定这样的级别,加上构建时的最小级别,并且只允许内联最高级别的函数.我知道没有标准的解决方案,但编译器特定的黑客也同样受欢迎.

我希望能够在调试器中逐步完成我的大多数非内联函数,但是应该内联其中一些,部分是出于性能原因,部分是为了避免疯狂深度调用堆栈.代码涉及一些非常令人讨厌的模板元编程,但这部分大部分已完成,所以我想专注于其余部分.因此,将属于模板元程序的函数内联,而不是其他内联函数会很好.

有没有办法实现这样的事情?

cdh*_*wie 8

具体取决于您的编译器,是的.对于g ++,以下内容将起作用:

void foo() __attribute__ ((noinline));
void foo() __attribute__ ((always_inline));
Run Code Online (Sandbox Code Playgroud)

在MSVC++上:

__declspec(noinline) void foo();
__forceinline void foo();
Run Code Online (Sandbox Code Playgroud)

请注意,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());
Run Code Online (Sandbox Code Playgroud)