您的位置:首页 > 大数据 > 人工智能

container_of分析

2014-04-03 13:06 363 查看
container_of是一个伟大的宏,其实现非常巧妙,值得学习。功能:根据对象的一个成员指针获取该对象的指针

#define container_of(ptr, type, member)({ /
const typeof(((type*)0)->member)*__mptr=(ptr); /
(type *)((char*)__mptr-offsetof(type,member));})

#define offsetof(TYPE, MEMBER)((size_t)&((TYPE*)0)->MEMBER)

1.ptr为物理地址,其类型和member类型一致,最终使用typeof(((type*)0)->member)由编译器自动返回member的类型

2.type为包含member成员的结构体

3.offsetof(type,member)为member成员在type结构体中的偏移值,大小范围0~sizeof(type)字节

(因为以0地址为type类型数据结构的起始地址)

4.ptr- offsetof()就等于包含该ptr的type结构体父变量的物理起始地址,强制转换为(type*).

值得一提的是,offsetof宏的实现非常巧妙,它把0地址转化为TYPE结构的指针,然后获取该结构中MEMBER成员的指针,并将其强制类型 转换为size_t类型。于是,由于结构从0地址开始定义,因此,cast后的MEMBER成员地址,实际上就是它在结构中的偏移量。这也显示出了C语言中指针的强大。因为,在某个体系结构下实现的libc,结构中各个成员的偏移总是可以预见的。offsetof的定义在stddef.h中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息