经常能在源码中很多分支条件判断加了这两个宏,了解具体的作用。
例如:
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);
函数的用法是:
EXPECTED 预期望结果
UNEXPECTED 不期望结果
UNEXPECTED和EXPECTED 就是预测分支结果来预先读取分支指令,增加代码的执行效率。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)