經常能在源碼中很多分支條件判斷加了這兩個宏,瞭解具體的作用。
例如:
if (UNEXPECTED(Z_TYPE_P(member) != IS_STRING)) {
ZVAL_COPY(&tmp_member, member);
convert_to_string(&tmp_member);
member = &tmp_member;
cache_slot = NULL;
}
#if PHP_HAVE_BUILTIN_EXPECT
# define EXPECTED(condition) __builtin_expect(!!(condition), 1)
# define UNEXPECTED(condition) __builtin_expect(!!(condition), 0)
#else
# define EXPECTED(condition) (condition)
# define UNEXPECTED(condition) (condition)
#endif
__builtin_expect
是 GCC 編譯器的一個內置宏,原型是
long __builtin_expect(long exp, long c);
函數的用法是:
- exp函數返回值
- 告訴編譯器期望 exp 等於 c
EXPECTED 預期望結果
UNEXPECTED 不期望結果
UNEXPECTED和EXPECTED 就是預測分支結果來預先讀取分支指令,增加代碼的執行效率。