关于Linux内核中哈希链表遍历宏的问题
时间:2010-07-03
来源:互联网
本帖最后由 jiufei19 于 2010-07-03 16:23 编辑
918 #define hlist_for_each_entry(tpos, pos, head, member) \
919 for (pos = (head)->first; \
920 pos && ({ prefetch(pos->next); 1;}) && \
921 ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
922 pos = pos->next)
这是linux内核中hash链表的遍历操作,在阅读此代码时我有两个地方不清楚,望各位前辈指教
1、为了简化在用户态下的程序使用,我将prefetch去掉了,功能是正确的,只是这样有什么不好吗?
2、{ prefetch(pos->next); 1;}和{ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}中的: ; 1;到底是用来干啥的?
918 #define hlist_for_each_entry(tpos, pos, head, member) \
919 for (pos = (head)->first; \
920 pos && ({ prefetch(pos->next); 1;}) && \
921 ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
922 pos = pos->next)
这是linux内核中hash链表的遍历操作,在阅读此代码时我有两个地方不清楚,望各位前辈指教
1、为了简化在用户态下的程序使用,我将prefetch去掉了,功能是正确的,只是这样有什么不好吗?
2、{ prefetch(pos->next); 1;}和{ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}中的: ; 1;到底是用来干啥的?
作者: jiufei19 发布时间: 2010-07-03
prefetch是用来预取的,有的体系架构支持预取,有的不支持,x86应该是不支持的,在x86上这个宏就是空的
作者: cugb_cat 发布时间: 2010-07-03
回复 cugb_cat
谢谢cugb_cat的答复,那么另外一个问题就是这里的如下复合语句的用途是为了什么?
({ prefetch(pos->next); 1;}) && \
和
({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
这里都有一个1,似乎前面的所有内容等于何种值都没有意义了,因为都是1,麻烦cgub_cat帮我解答下,谢谢!
谢谢cugb_cat的答复,那么另外一个问题就是这里的如下复合语句的用途是为了什么?
({ prefetch(pos->next); 1;}) && \
和
({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
这里都有一个1,似乎前面的所有内容等于何种值都没有意义了,因为都是1,麻烦cgub_cat帮我解答下,谢谢!
作者: jiufei19 发布时间: 2010-07-04
QUOTE:
回复 cugb_cat
谢谢cugb_cat的答复,那么另外一个问题就是这里的如下复合语句的用途是为了什 ...
jiufei19 发表于 2010-07-03 18:19
谢谢cugb_cat的答复,那么另外一个问题就是这里的如下复合语句的用途是为了什 ...
jiufei19 发表于 2010-07-03 18:19
gcc的扩展,({ ...; ...; }) 是一个表达式,它的值是其最后一个表达式的值。与逗号表达式不同的是它前面可以是statements,比如变量定义等,不需要是表达式。
http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html#SEC62
作者: emacsnw 发布时间: 2010-07-04
本帖最后由 jiufei19 于 2010-07-04 19:24 编辑
回复 emacsnw
十分感谢emacsnw的解答! 那么这里始终用1来作为最后一个值到底是什么意思呢?
回复 emacsnw
十分感谢emacsnw的解答! 那么这里始终用1来作为最后一个值到底是什么意思呢?
作者: jiufei19 发布时间: 2010-07-04
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28