好处在于union结构中的数据是共享内存的。
对于使用量很大的数据结构,如果稍微增加点内容,可能就会导致很大的内存开销。为了重复利用这个结构,即,在不同的情景下发挥不同的作用,可以定义union结构。
代码1中的定义方式,可以在next和prev不充当链表的指针时,将这部分内存用作他用。U64是保证这个结构的大小是8个字节,指针一般只有4个字节。union的大小由内部最大的结构决定
这样定义链表的方式我也是第一次看到,不过union的这种使用方法你可以参考struct page,里面有很多例子
回复 1# ymc4444
你这个list_head的定义,重那挖出来的,我搜索了最新的内核代码,这个结构体的定义一直都是:186 struct list_head {
187 struct list_head *next, *prev;
188 };没有看过你这么写的。
你这么么写的作用是让next和prev都按64位对齐。你想让这个结构体可以在64位系统下运行32位程序时传递数据方便?这是我能想到的这么做的唯一一个理由。
但如果要这么做,比较好的方式应该采用GCC的对齐属性。
回复 2# lamp_lighter
首先,在64位系统里,指针是64位的。
其次,从变量名来说,认定成reserved1这种名,不像是常规的union用法。reserved1这个变量看上去只为了撑空间,而不是复用空间。
回复 2# lamp_lighter
比如有些特殊情况,需要自己在一块连续内存里面,构造出来一个链表。那么 next 和 prev 可以考虑用 offset 的方式,即相对于那块内存的 base addr 偏移多少个元素或者 bytes 都可以。
回复 4# Tinnal
我开始以为reserved是为了便于拓展才加进去的,还是你说的考虑64位的兼容性更靠谱些,多谢指正!
本帖最后由 lamp_lighter 于 2014-08-25 14:38 编辑
回复 5# Godbach
那将prev和next转化为offset的方式寻址,有什么特殊的意义吗?
回复 7# lamp_lighter
应用场合不同而已。
回复 8# Godbach
好的,谢谢
可以减少内存消耗吧
页:
[1]