琐事
如果我们希望编译器优化代码的某些部分,则可以安全地使用#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);
}
问题是,当cond
false
时,是否会有任何开销,或者编译器会优化所有内容,因为log
函数inline
?
一般来说,人们永远无法确定它是否会inline
工作,因为它更像是编译器的线索而不是真正的需求(当然,在内联方面,在链接和变量方面,它非常严格(。当然,编译器极有可能优化不必要的log
调用,但这不是标准所要求的。如 cpp 参考中所述
由于关键字内联的这种含义是非绑定的,因此编译器是 自由使用内联替换任何未标记的函数 内联,并且可以自由生成对任何标记为的函数的函数调用 内嵌。
为了确保您必须使用__forceinline
编译器扩展