cpu通常从内存中一次读取8个byte(或4个),为提高效率,在程序中对数据进行alignment限制,能够提高内存存取效率。linux对齐通常采用(x86_64):
- short: 2-byte alignment
- int: 4-bype alignment
- long, double: 8-byte alignment
8-byte对齐意味着结构体中每个
malloc必须根据返回数据类型,分配满足相应对齐要求的地址。对于结构体,编译器会在变量之间加入填充以使每个成员变量起始地址满足对齐要求。另外,编译器可能会在结构体末尾加入填充以使每个成员变量满足对齐要求。总之,对齐使得结构体起始地址、每个成员变量起始地址、以及每个成员的大小都满足统一的要求。
在rbtree.h中,对rb_node采用了8-byte的对齐,
struct rb_node
{
unsigned long rb_parent_color;
#define RB_RED 0
#define RB_BLACK 1
struct rb_node *rb_right;
struct rb_node *rb_left;
} __attribute__((aligned(sizeof(long))));
/* The alignment might seem pointless, but allegedly CRIS needs it */
这样任何rb_node结构起始地址都是8-byte对齐的,如0x7fbffff478,0x7fbffff488。其地址末尾bit表示只能是1000。因此,其末尾三位被废物利用,用来表示color,前面的部分则用来表示rb_node型指针。
#define rb_parent(r) ((struct rb_node *)((r)->rb_parent_color & ~3))
#define rb_color(r) ((r)->rb_parent_color & 1)
#define rb_is_red(r) (!rb_color(r))
#define rb_is_black(r) rb_color(r)
#define rb_set_red(r) do { (r)->rb_parent_color &= ~1; } while (0)
#define rb_set_black(r) do { (r)->rb_parent_color |= 1; } while (0)
阅读(1936) | 评论(0) | 转发(0) |