正確的方式來定義在C++ 11可能/不可能宏如下:
#define LIKELY(condition) __builtin_expect(static_cast<bool>(condition), 1)
#define UNLIKELY(condition) __builtin_expect(static_cast<bool>(condition), 0)
當這些宏這種方式定義的:
#define LIKELY(condition) __builtin_expect(!!(condition), 1)
即可以改變語句的含義if
並破解代碼。請看下面的代碼:
#include <iostream>
struct A
{
explicit operator bool() const { return true; }
operator int() const { return 0; }
};
#define LIKELY(condition) __builtin_expect((condition), 1)
int main() {
A a;
if(a)
std::cout << "if(a) is true\n";
if(LIKELY(a))
std::cout << "if(LIKELY(a)) is true\n";
else
std::cout << "if(LIKELY(a)) is false\n";
}
,其輸出:
if(a) is true
if(LIKELY(a)) is false
正如你所看到的,有可能使用!!
作爲劇組到bool
休息if
語義的定義。
這裏的要點不是operator int()
和operator bool()
應該有關係。這是一個很好的做法。
相反,使用!!(x)
而不是static_cast<bool>(x)
會丟失C++11 contextual conversions的上下文。
如果有任何異常(獨立於編譯器),也可能會引發異常 – Shep
密切相關:Linux內核中的[可能()/不太可能())宏 - 它們如何工作?他們的好處是什麼?](http://stackoverflow.com/q/109710/1068283) –