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);
}
问题是,当cond
false
时,是否会有任何开销,或者编译器会优化所有内容,因为log
函数inline
?
一般来说,人们永远无法确定它是否会inline
工作,因为它更像是编译器的线索而不是真正的需求(当然,在内联方面,在链接和变量方面,它非常严格(。当然,编译器极有可能优化不必要的log
调用,但这不是标准所要求的。如 cpp 参考中所述
由于关键字内联的这种含义是非绑定的,因此编译器是 自由使用内联替换任何未标记的函数 内联,并且可以自由生成对任何标记为的函数的函数调用 内嵌。
为了确保您必须使用__forceinline
编译器扩展
相关文章:
- 为什么使用SFINAE而不是函数重载
- #ifdef和未声明的标识符
- 如何使用模板函数的函数签名进行SFINAE
- 数据成员SFINAE的C++17测试:gcc vs clang
- 使用在用于SFINAE的void_t中具有参数的方法
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- C++ Macros #ifdef
- 提供与TMP和SFINAE的通用接口
- "Inverse SFINAE"避免模棱两可的过载
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 如何在儿童类中使用SFINAE
- 使用 SFINAE 作为模板参数的编译时递归
- 使用 SFINAE 设计模板方法
- 与SFINAE支票交朋友
- 有没有办法在不使用 #ifdef 的情况下不编译发布版本中的单元测试函数体?
- C++许多 SFINAE 风格的过载
- 是否可以混合使用SFINAE和模板专业化?
- C++表达SFINAE和ostream操纵器
- SFINAE不能防止模棱两可的操作员过载吗?
- SFINAE-based ifdef