概要
对Linux内核源码的学习,目前阶段也是学习前辈们的总结,站在巨人的肩膀上。
博客园主skywang12345发布的源码:http://www.cnblogs.com/skywang12345/p/3624202.html
struct rb_node结构体
参考CSDN博客:http://blog.csdn.net/cwcmcw/article/details/17174891
1 struct rb_node 2 { 3 unsigned long rb_parent_color; 4 #define RB_RED 0 5 #define RB_BLACK 1 6 struct rb_node *rb_right; 7 struct rb_node *rb_left; 8 } __attribute__((aligned(sizeof(long))));
sizeof(long):返回long类型的字节数n(32位机器n = 4, 64位机器n=8);
aligned(n):指明结构体n字节对齐;
__attribute__是GCC编译器的扩展,属性约束;
这句话的含义:struct rb_node按照4字节(long)对齐!
对于__attribute__和aligned详细说明和用法可以查阅gcc在线用户手册。
为什么成员变量rb_parent_color既可以表示父节点指针,又可以表示颜色?
首先,要搞清楚结构体对齐的机制,以 32 位机器举例,structrb_node结构体4字节对齐,那么它在内存中的基地址base一定是的4的倍数(base % 4 == 0);由于指针在32位系统之上占用4B,则32bit基地址base的低两位一定为0(否则“base % 4 == 0”不成立,不再是4B对齐)。
红黑树节点的颜色只有两个——红(0)和黑(1),使用1bit就足够表示!而struct rb_node结构体基地址低2位“不使用”,那么可以使用最低位来存储节点的颜色,把基地址和颜色值或(|)运算整合成一个变量__rb_parent_color,这样就节省了一个存储颜色的变量。
如果单独定义一个变量来存储颜色值,假设4B无符号整型(即使是shot或者char类型,在4B对齐状态下也是占用4B)那么当树的节点数量增长时,每增长一个树节点,就会多开销4B!并且存储父节点地址的变量低两位又不使用,4个树节点就浪费1B;记住:核心内存有限,每消耗1B,核心就少1B——不损失性能的情况下,能节约就节约!