container_of分析
2014-04-03 13:06
363 查看
container_of是一个伟大的宏,其实现非常巧妙,值得学习。功能:根据对象的一个成员指针获取该对象的指针
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中。
#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中。
相关文章推荐
- 关于container_of和list_for_each_entry 及其相关函数的分析
- container_of的实现分析
- container_of(prt, type, member)分析
- container_of分析
- container_of分析
- linux内核的container_of()宏定义分析
- Linux内核 container_of 宏和 offsetof 宏分析
- container_of和list_for_each_entry 及其相关函数的分析
- container_of分析
- container_of分析
- container_of 宏、offsetof 宏 分析
- container_of 分析
- container_of(ptr,type,member)封装分析
- 关于container_of和list_for_each_entry 及其相关函数的分析
- container_of分析
- container_of分析
- container_of分析【转】
- 对container_of(ptr,type,member)分析
- 关于container_of和list_for_each_entry 及其相关函数的分析
- container_of分析--可用good【转】