#ifdef __clang__
#define CallNoInline(f) (decltype(&f) ((intptr_t)f - 1 + 1))
#elif defined(_MSC_VER)
#define CallNoInline(f) (decltype(&f) ((intptr_t)f - 1 + 1))
#elif defined(__ICC)
template<typename T> auto ____get(T* p) { return p;}
#define CallNoInline(f) (____get(f))
#elif defined(__GNUC__)
#define CallNoInline(f) ((decltype(&f) volatile&) \
(decltype(&f) const &) (decltype(&f)(f)))
#endif
inline
int f_call_by_noinline(int a)
{
return 123 + a;
}
inline
int f_call_by_normal(int a)
{
return 456 + a;
}
#ifdef __GNUC__
__attribute__((noinline))
#elif defined(_MSC_VER)
__declspec(noinline)
#endif
inline
int f_noinline(int a)
{
return 789 + a;
}
int main()
{
//auto* pf = f;
int ret1 = CallNoInline(f_call_by_noinline)(1);
int ret2 = f_call_by_normal(1);
printf("%d %d", ret1, ret2);
return ret1;
}
强制noinline地调用目标函数 O2/3 兼容gcc clang msvc icc
最新推荐文章于 2022-06-12 15:06:23 发布