Chinaunix首页 | 论坛 | 博客
  • 博客访问: 257095
  • 博文数量: 86
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 640
  • 用 户 组: 普通用户
  • 注册时间: 2018-10-15 14:13
个人简介

搭建一个和linux开发者知识共享和学习的平台

文章分类

全部博文(86)

文章存档

2023年(24)

2022年(27)

2019年(8)

2018年(27)

分类: C/C++

2018-10-15 15:23:11

获取结构体成员偏移
#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]))
阅读(2796) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~