Linux模式设计2-数据比较
来源:互联网 发布:淘宝商城9.9元包邮 编辑:程序博客网 时间:2024/06/18 05:24
-------------------------------------------
本文系作者原创, 欢迎大家转载!
转载请注明出处:netwalker.blog.chinaunix.net
-------------------------------------------
由于Linux代码采用Gcc编译器编译,所以它可以采用Gcc对C语言的扩展特性,以实现高效的代码。其中运用非常广泛的扩展就是复合语句。Gcc把包含在圆括号和大括号双层括号内的复合语句看作是一个表达式,它可以出现在任何允许表达式的地方,而复合语句中可以声明局部变量,以及循环条件判断等复杂处理。而表达式的最后一条语句必须是一个表达式,它的计算结果作为返回值。
- int a = ({typeof(a) _a = 0; ++_a;});
上例中符合表达式中声明了局部变量_a,而返回值为++_a的结果,所以a的值为1。基于这种扩展,内核可以通过在复合语句中定义局部变量而表面自加自减运算符的副作用问题。内核中的min_t和max_t宏就是这样实现的。
- include/linux/kernel.h
- #define min_t(type, x, y) ({ \
- type __min1 = (x); \
- type __min2 = (y); \
- __min1 < __min2 ? __min1: __min2; })
- #define max_t(type, x, y) ({ \
- type __max1 = (x); \
- type __max2 = (y); \
- __max1 > __max2 ? __max1: __max2; })
尽管多数时候通过使用这类宏,可以避免参数的副作用,但是这会增加内存的开销和执行效率,所以如果能够保证参数不存在副作用,那么使用通常的如下定义即可:
- #define min(a, b) ((a) > (b)? (b) : (a))
- #define max(a, b) ((a) > (b)? (a) : (b))
以上的min_t和max_t宏适需要提供数据类型,typeof的出现使这一步也可被省略。
- include/linux/kernel.h
- #define min(x, y) ({ \
- typeof(x) _min1 = (x); \
- typeof(y) _min2 = (y); \
- (void) (&_min1 == &_min2); \
- _min1 < _min2 ? _min1 : _min2; })
- #define max(x, y) ({ \
- typeof(x) _max1 = (x); \
- typeof(y) _max2 = (y); \
- (void) (&_max1 == &_max2); \
- _max1 > _max2 ? _max1 : _max2; })
观察min和max的实现,它们通过typeof获取x和y的类型,然后定义局部变量以消除参数副作用。注意到中间的比较运算,如果x和y的类型不同,那么编译器将提示如下警告信息,这对检查代码很有帮助。
- xxx.c:35: warning: comparison of distinct pointer types lacks a cast
0 0
- Linux模式设计2-数据比较
- Linux模式设计1-数据大小
- 模式设计 比较
- 设计模式比较
- 设计模式 特点比较
- 设计模式笔记--设计模式比较
- 设计模式笔记--设计模式比较
- 一些设计模式的比较
- 两种设计模式比较
- 新模式以及设计模式比较
- Linux模式设计--数据大小,对齐函数相关
- 设计模式--创建型模式比较
- 设计模式--结构型模式比较
- 设计模式--对象行为模式比较
- 设计模式:桥接模式优点比较
- 设计模式--创建型模式比较
- 设计模式--结构型模式比较
- 设计模式--对象行为模式比较
- Linux模式设计1-数据大小
- brew 安装命令
- struts2的if,elseif字符串的比较
- 邓颖超临终前说的最后俩字竟是“李鹏”(图)
- SWJ小谈:百度IM捷报 软件图片大曝光之SWJ小感受
- Linux模式设计2-数据比较
- 参考博客网址
- Mysql通过EXPLAIN 分析低效SQL 的执行计划
- 传微信300元/年今日全面开放接口,企业能用它们来做啥?
- 深入探讨在集群环境中使用 EhCache 缓存系统
- 从EXCEL导出数据到XML
- 如何对PNG进行压缩?PNG24压缩方法
- Cocos2d-x+Plugin-X插件集成指南 cocos2d-x 2.13
- Android Media Scanner Mechanism Analyze