获取结构体成员偏移
#define offsetof(TYPE,MEMBER) ((size_t)&((TYPE *)0)->MEMBER)
从数据结构的一个元素出发,得到整个数据结构的指针
#define container_of(ptr,type,member) ({const typeof(((type *)0)->member *__mptr=(ptr); (type *)((char *)__mptr - offsetof(type,member));})
示例
struct A_s a;
int *pb=&(a.b);
struct A_s *p=container_of(pb,struct A_s,b);
hlist 是hash list的简称,即用拉链法实现hash数据结构。有两部分组成:hash数组和冲突链。当节点第一次要插入hash表的时候,它必定是先插入hash数组中,而以后要插入的结点如果发生了冲突,则可以挂在数组后面,形成一条链表。
struct hlist_head {
struct hlist_node *first;
};
struct hlist_node {
struct hlist_node *next, **pprev;
};
不仅内核可以使用下面的编译指令,用户态的程序编译也可以使用gcc-O2优化编译选项来编译c程序,当存在最最可能发生的分支情形时,使用likely,而当存在最最不可能发生的分支清醒时,使用unlikely。
# define likely(x) __builtin_expect(!!(x), 1)
# define unlikely(x) __builtin_expect(!!(x), 0)
获取结构体数组个数
#define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0]))
阅读(2874) | 评论(0) | 转发(0) |