c++ - 有选择地内联函数(用于调试目的)?

标签 c++ inline

我想要的是一个构建配置,其中函数内联,除了一些选定的函数(可能内联也可能不内联,那将是取决于编译器)。

更好的是某种“内联级别”,我可以在其中为每个函数指定这样的级别,并在构建时加上最低级别,并且只允许内联高于最低级别的函数。我知道对此没有标准的解决方案,但同样欢迎特定于编译器的黑客攻击。

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

有什么办法可以达到这样的目的吗?

最佳答案

是的,取决于您的编译器。对于 g++,以下将起作用:

void foo() __attribute__ ((noinline));
void foo() __attribute__ ((always_inline));

在 MSVC++ 上:

__declspec(noinline) void foo();
__forceinline void foo();

请注意,g++ 要求 属性仅应用于原型(prototype),而非定义。因此,如果您的函数是仅定义的(没有单独的原型(prototype)),那么您必须创建一个原型(prototype)才能应用该属性。 MSVC 没有这个要求。

__forceinline 特别有 some exceptions .请务必仔细阅读它们,以便了解它是否会对您的特定情况产生任何影响。 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());

关于c++ - 有选择地内联函数(用于调试目的)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11003932/

相关文章:

c# - 在电子邮件中发送内联图像

c++ - 使用类成员正确声明函数?

java - 将 C++ 库转换为 .so/.dll 共享库

c++ - 如何在 QQmlListProperty 属性中正确通知?

JQuery 添加 css 不是内联的

forms - 内嵌表单输入和提交按钮在屏幕宽度 < 576 px 时未对齐

c++ - Lazy C++ (lzz) 与 Doxygen 配合得好吗?

c++ - 在此范围内未声明构造函数 'cout'

css - Fancybox 画廊的前 2 张图像相对于画廊的其余部分处于不同的高度

java - 在java中强制内联