免费注册 查看新帖 |

Chinaunix

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

[数据结构] 结构构这样定义有什么好处啊? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-21 14:28 |只看该作者 |倒序浏览
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
2 [报告]
发表于 2014-08-21 16:38 |只看该作者
本帖最后由 lamp_lighter 于 2014-08-21 16:47 编辑

好处在于union结构中的数据是共享内存的。

对于使用量很大的数据结构,如果稍微增加点内容,可能就会导致很大的内存开销。为了重复利用这个结构,即,在不同的情景下发挥不同的作用,可以定义union结构。

代码1中的定义方式,可以在next和prev不充当链表的指针时,将这部分内存用作他用。U64是保证这个结构的大小是8个字节,指针一般只有4个字节。union的大小由内部最大的结构决定

这样定义链表的方式我也是第一次看到,不过union的这种使用方法你可以参考struct page,里面有很多例子

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
3 [报告]
发表于 2014-08-23 22:11 |只看该作者
回复 1# ymc4444
你这个list_head的定义,重那挖出来的,我搜索了最新的内核代码,这个结构体的定义一直都是:
  1. 186 struct list_head {
  2. 187         struct list_head *next, *prev;
  3. 188 };
复制代码
没有看过你这么写的。

你这么么写的作用是让next和prev都按64位对齐。你想让这个结构体可以在64位系统下运行32位程序时传递数据方便?这是我能想到的这么做的唯一一个理由。
但如果要这么做,比较好的方式应该采用GCC的对齐属性。

   

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
4 [报告]
发表于 2014-08-23 22:14 |只看该作者
回复 2# lamp_lighter

首先,在64位系统里,指针是64位的。
其次,从变量名来说,认定成reserved1这种名,不像是常规的union用法。reserved1这个变量看上去只为了撑空间,而不是复用空间。


   

论坛徽章:
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 [报告]
发表于 2014-08-24 10:35 |只看该作者
回复 2# lamp_lighter

比如有些特殊情况,需要自己在一块连续内存里面,构造出来一个链表。那么 next 和 prev 可以考虑用 offset 的方式,即相对于那块内存的 base addr 偏移多少个元素或者 bytes 都可以。




   

论坛徽章:
0
6 [报告]
发表于 2014-08-25 14:35 |只看该作者
回复 4# Tinnal
我开始以为reserved是为了便于拓展才加进去的,还是你说的考虑64位的兼容性更靠谱些,多谢指正!


   

论坛徽章:
0
7 [报告]
发表于 2014-08-25 14:37 |只看该作者
本帖最后由 lamp_lighter 于 2014-08-25 14:38 编辑

回复 5# Godbach
那将prev和next转化为offset的方式寻址,有什么特殊的意义吗?
   

论坛徽章:
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
8 [报告]
发表于 2014-08-25 23:18 |只看该作者
回复 7# lamp_lighter

应用场合不同而已。


   

论坛徽章:
0
9 [报告]
发表于 2014-08-26 14:22 |只看该作者
回复 8# Godbach
好的,谢谢
   

论坛徽章:
7
酉鸡
日期:2014-09-12 14:21:19天蝎座
日期:2014-11-05 09:00:492015年亚洲杯之伊朗
日期:2015-03-05 16:16:172015元宵节徽章
日期:2015-03-06 15:52:302015小元宵徽章
日期:2015-03-06 15:58:182015年亚洲杯之韩国
日期:2015-03-18 10:49:4515-16赛季CBA联赛之山东
日期:2016-12-06 01:17:52
10 [报告]
发表于 2014-08-26 15:51 |只看该作者
可以减少内存消耗吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP