双布尔否定运算符

15 浏览
0 Comments

双布尔否定运算符

我在Microsoft的GSL实现(C++指南支持库)中发现了这段代码:\n

#if defined(__clang__) || defined(__GNUC__)
#define GSL_LIKELY(x) __builtin_expect(!!(x), 1)
#define GSL_UNLIKELY(x) __builtin_expect(!!(x), 0)
#else
#define GSL_LIKELY(x) (!!(x))
#define GSL_UNLIKELY(x) (!!(x))
#endif

\n我在这里这里读到了关于__builtin_expect的内容,但是仍然不清楚在(!!(x))中双重布尔否定操作符的作用是什么。为什么要使用它?\n相关文件是这个

0
0 Comments

(Double boolean negation operator)是为了确保所有真值都转换为1(从而与中的1匹配),所有假值都匹配中的0。即使<__builtin_expect>不可用,双重否定也会保留以保持统一性(因为调用者可能存储返回值以供除条件外的其他用途使用)。

这里出现双重否定的原因是为了在使用时,通过双重否定将所有真值转换为1,将所有假值转换为0。这样可以在条件语句中使用这些宏进行性能优化。

双重否定的解决方法是,即使<__builtin_expect>不可用,也要保留双重否定,以保持代码的统一性。这样可以在调用者存储返回值以供其他用途使用时,保持代码的一致性。

下面是使用双重否定的示例代码:

#define GSL_LIKELY(x)   (__builtin_expect(!!(x), 1))
#define GSL_UNLIKELY(x) (__builtin_expect(!!(x), 0))
int func(int x) {
    if (GSL_LIKELY(x > 0)) {
        return x + 1;
    } else {
        return x - 1;
    }
}

在这个例子中,双重否定操作符用于将条件表达式的结果转换为1或0。这样可以提高条件语句的性能,因为编译器可以根据期望的结果进行优化。

总结起来,双重否定操作符的出现是为了在条件语句中使用宏进行性能优化。即使<__builtin_expect>不可用,双重否定操作符也会被保留以保持代码的一致性。这样可以将真值转换为1,将假值转换为0,从而提高条件语句的性能。

0