PHP源碼中EXPECTED和UNEXPECTED的作用

經常能在源碼中很多分支條件判斷加了這兩個宏,瞭解具體的作用。

例如:

	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 就是預測分支結果來預先讀取分支指令,增加代碼的執行效率。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章