SFINAE-based ifdef

SFINAE-based ifdef

本文关键字:ifdef SFINAE-based      更新时间:2023-10-16

琐事

如果我们希望编译器优化代码的某些部分,则可以安全地使用#ifdef,如下所示。

#ifdef LOG
mtmd();
#endif

因此,如果在编译期间未定义LOG,则在执行期间不会产生开销。

问题

我有兴趣使用SFINAE实现相同的机制。代码的简化版本如下所示。

template <bool cond, typename std::enable_if<cond>::type* = nullptr>
inline void log(void (*func)(int, int), int in, int out) {
(*func)(in, out);
}
template <bool cond, typename std::enable_if<!cond>::type* = nullptr>
inline void log(void (*func)(int, int), int in, int out) {}

我可以以以下形式使用它。

void mtmd(int x, int y) { /* Do something */}
int main() {
constexpr cond = true; // or flase
int x, y;
log<cond>(&mtmd, x, y);
}

问题是,当condfalse时,是否会有任何开销,或者编译器会优化所有内容,因为log函数inline

一般来说,人们永远无法确定它是否会inline工作,因为它更像是编译器的线索而不是真正的需求(当然,在内联方面,在链接和变量方面,它非常严格(。当然,编译器极有可能优化不必要的log调用,但这不是标准所要求的。如 cpp 参考中所述

由于关键字内联的这种含义是非绑定的,因此编译器是 自由使用内联替换任何未标记的函数 内联,并且可以自由生成对任何标记为的函数的函数调用 内嵌。

为了确保您必须使用__forceinline编译器扩展