我从Microsoft implementation of GSL(C ++指南支持库)中看到了这段代码:
#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
我读到了__builtin_expect
(here和here),但我仍不清楚(!!(x))
中双布尔否定运算符的用途是什么。为什么使用它?
有问题的文件是this one。
答案 0 :(得分:6)
def Delete(self,test1):
client=MongoClient('localhost',27017)
db=client.test
collection=db.test1
db.test1.remove({"_id": ObjectId("5a880803afe40825990e7255")})
使用严格相等,所以这里的双重否定点是确保所有的真值都转换为1(从而匹配__builtin_expect
中的1),以及所有的虚假值匹配GSL_LIKELY
中的0。
即使GSL_UNLIKELY
无法保持一致性,也会保留双重否定(因为调用者可能会将其他用途的返回值存储为__builtin_expect
中的条件)。