linux 内核 min max,从min & max一窥linux设计

"博客探讨了在C语言中如何实现min和max函数,通过宏定义和内联函数的方式,并指出了一般实现中存在的问题,即x++和y++可能被重复执行。文章引用了Linux内核的宏定义方式来避免这类问题,通过创建临时变量和类型检查确保正确执行。总结了宏定义中typeof和{}
摘要由CSDN通过智能技术生成

好吧,我承认我标题党了。但是我仍然建议你能够继续往下读,最多花上一分钟时间。当然,如果能够浪费你十分钟以上,我的目的便达到了,而你也会有不一样的体会。

问题:你会怎样实现min & max这两个函数呢?

我想大多数人的做法无非三种:1)定义宏;2)定义函数; 3)定义inline函数。

对于第二种方法,不用多说,功能如此单一的函数效率会有折扣;对于第三种方法,inline是在较新的C99中引入的。其实我是在找理由,我太懒了,不想讨论第二种和第三种,也是在掩饰现代编译器强悍的优化能力。也许,编译器自动为你把小函数优化成内联了呢。OK,我们这里的主题是关于宏定义的,和其他无关。请看(下文都以min为例):

#define min(X,Y) ((X) < (Y) ? (X) : (Y))

这是一般的做法,对每个符号都还添加了括号处理,是比较让人满意的了。会有什么问题呢,继续请看:

int x = 1, y = 2;

printf("min=%d/n", min(x++, y++));   //输出min=2

printf("x = %d, y = %d/n", x, y);    //输出x=3, y=3

问题出现了,我们原本预期执行min操作后,x为2,y为3。到底发生了什么呢,让我们对宏进行展开:

((x++) < (y++) ? (x++) : (y++))

看出来了吗?问题就出在这里,x++被执行了两次。让我们看看伟大的linux内核是怎么解决这个问题的吧。

//include/linux/kernel.h

#define min(x,y) ({ /

typeof(x) _x = (x); /

typeof(y) _y = (y); /

(void) (&_x == &_y); /

_x < _y ? _x : _y; })

#define max(x,y) ({ /

typeof(x) _x = (x); /

typeof(y) _y = (y); /

(void) (&_x == &_y); /

_x > _y ? _x : _y; })

我在这里进行简单的解释:

1)typeof(X)的用途:得到X的类型信息。比如typeof(10) 为int, double f = 1.0; typeof(f)为double。

2)({})的用途:一句话,({和})之间可以有很多表达式,它的值为最后一个表达式的值。

3)(void) (&_x == &_y);这一句的作用是对_x和_y的类型判断是否一样。如果是不同的类型,编译器会给出警告信息。

说白了,上述宏定义就是先引入和x及y同样类型的两个临时变量,然后对临时变量进行求最大值或者最小值。

怎么样,有收获吗?有想法吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值