免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2338 | 回复: 9
打印 上一主题 下一主题

请教 表达式 !!(x) 和 (x)有什么差别吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-24 13:38 |只看该作者 |倒序浏览
请教 表达式  !!(x) 和 (x)有什么差别吗?
比如下面这个宏
#  define likely(x)     (__builtin_constant_p(x) ? !!(x) : __branch_check__(x, 1))

!!(x) 和 x 不是相等的吗?

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
2 [报告]
发表于 2010-11-24 13:41 |只看该作者
类型不一样.

论坛徽章:
0
3 [报告]
发表于 2010-11-24 13:45 |只看该作者
如果x不为0,!!(x)可以把x变成1

论坛徽章:
0
4 [报告]
发表于 2010-11-24 13:53 |只看该作者
本帖最后由 论坛ID 于 2010-11-24 13:55 编辑

这个问题在《professional linux kernel architecture》里面有讨论,在1199页。
  1. #define likely(x) __builtin_expect(!!(x), 1)
  2. #define unlikely(x) __builtin_expect(!!(x), 0)
  3. The double negation !! is used for two reasons:
  4. ❑ It enables the macros to be used with pointers that are implicitly converted into a truth value.
  5. ❑ Truth values greater than zero (explicitly allowed in C) are standardized to 1 as expected by __builtin_expect.
复制代码

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
5 [报告]
发表于 2010-11-24 14:06 |只看该作者
2 楼正解。

其实这样的问题,完全可以自己先实验一下。
x = 100,看一下这两个表达式执行结果是什么。

论坛徽章:
0
6 [报告]
发表于 2010-11-24 14:08 |只看该作者
回复 3# 论坛ID


    非常感谢!了解了

论坛徽章:
0
7 [报告]
发表于 2010-11-24 21:30 |只看该作者
!! 取的是bool值

论坛徽章:
0
8 [报告]
发表于 2010-11-25 12:32 |只看该作者
http://haoyeren.blog.sohu.com/115430836.html(作者原创的 我不能转 就摘抄一点)

#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)

这两句是一对对应关系。__builtin_expect(expr, c)这个函数是新版gcc支持的,它是用来作代码优化的,用来告诉编译器,expr的期,非常有可能是c,这样在gcc生成对应的汇编代码的时候,会把相应的可能执行的代码都放在一起,这样能少执行代码的跳转。为什么这样能提高CPU的执行效率呢?因为CPU在执行的时候,都是有预先取指令的机制的,把将要执行的指令取出一部分出来准备执行。CPU不知道程序的逻辑,所以都是从可程序程序里挨着取的,如果这个时候,能不做跳转,则CPU预先取出的指令都可以接着使用,反之,则预先取出来的指令都是没有用的。还有个问题是需要注意的,在__builtin_expect的定义中,以前的版本是没有!!这个符号的,这个符号的作用其实就是负负得正,为什么要这样做呢?就是为了保证非零的x的值,后来都为1,如果为零的0值,后来都为0,仅此而已。

论坛徽章:
0
9 [报告]
发表于 2010-11-25 13:32 |只看该作者
!!(x)

等同于

  1. return x ? 1 : 0;
复制代码

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
10 [报告]
发表于 2010-11-25 13:51 |只看该作者
白金兄的总结 短小精悍!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP