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 就是预测分支结果来预先读取分支指令,增加代码的执行效率。

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