关于php内核中 __builtin_expect 的解释
2015-11-19 11:57
447 查看
Zend/zend_portability.h
main/php-config.h
解释:
例子:
Zend/zend_API.h
#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
main/php-config.h
/* Whether the compiler supports __builtin_expect */ #define PHP_HAVE_BUILTIN_EXPECT 1
解释:
# define EXPECTED(condition) __builtin_expect(!!(condition), 1) # define UNEXPECTED(condition) __builtin_expect(!!(condition), 0) 1 !!(condition)真假变量 非非得真的逻辑运算,以0或1来达到预判 2 if(EXPECTED(condition)) 等价于 if(condition) if(UNEXPECTED(condition)) 也等价于 if(condition) 3 __builtin_expect((condition),1) 表示 condition 的值为真的可能性更大。 __builtin_expect((condition),0) 表示 condition 的值为假的可能性更大。 编译器在编译过程中,会将可能性更大的代码紧跟着前面的代码,从而减少指令跳转。
例子:
Zend/zend_API.h
static zend_always_inline int zend_parse_arg_str(zval *arg, zend_string **dest, int check_null) { if (EXPECTED(Z_TYPE_P(arg) == IS_STRING)) { *dest = Z_STR_P(arg); } else if (check_null && Z_TYPE_P(arg) == IS_NULL) { *dest = NULL; } else { return zend_parse_arg_str_slow(arg, dest); } return 1; } static zend_always_inline int zend_parse_arg_string(zval *arg, char **dest, size_t *dest_len, int check_null) { zend_string *str; if (!zend_parse_arg_str(arg, &str, check_null)) { return 0; } if (check_null && UNEXPECTED(!str)) { *dest = NULL; *dest_len = 0; } else { *dest = str->val; *dest_len = str->len; } return 1; }
相关文章推荐
- the behavior of the UICollectionViewFlowLayout is not defined because:
- 再用UICollectionView做无限轮播的时候,布局错乱出现黑边,很可能是
- String、StringBuffer和StringBuilder的区别
- iOS---UITextView: 响应键盘的 return 事件
- IOS-简单UI组件的一些常见问题
- IOS上 关于状态栏的相关设置(UIStatusBar)
- 关于使用UICollectionView做选项卡,内部控件越界问题
- [LeetCode]95. Implement Stack using Queues用队列实现栈
- 幻灯片插件FlexSlider -- Amaze UI幻灯片参数
- [LeetCode]95. Implement Stack using Queues用队列实现栈
- DATA
- iOS中的UI
- ios中uitableview显示两列或多列数据
- NGUI系统学习笔记1
- startActivityForResult() 中requestCode 和 resultCode 的作用
- Busybox building errors sets
- UITextView添加占位字符
- IOS学习之 iOS8新特性 UIPresentationController
- UIScrollView 滚动方向
- String、StringBuffer及StringBuilder三者区别