31.offsetof宏与container_of宏
2016-04-04 16:54
513 查看
31.1.offsetof宏
(1)作用:用宏来计算结构体中某个元素和结构体首地址的偏移量(其本质是通过编译器来帮我们计算)。
(2)原理:我们虚拟1个type类型结构体变量,然后用type.member的方式来访问某个member元素,继而得到member相对于整个变量首地址的偏移量。
(3)学习思路:第1步先学会用offsetof宏;第2步再去理解这个宏的实现原理(见图1)。
31.2.container_of宏
(1)作用:知道某个结构体中某个元素的指针,反推整个结构体变量的指针,继而得到结构体中其它元素的指针。
(2)typeof关键字:typeof(a)即由变量a得到a的类型,typeof就是由变量名得到变量的数据类型。
(3)原理:先用typeof得到member元素的类型,然后通过该类型定义指向member元素的指针,然后用该指针减去该元素相对于整个结构体变量的偏移量(偏移量用offsetof宏得到)后得到整个结构体变量的首地址,再把该地址强制类型转换为type *即可。
(3)学习思路:第1步先学会用container_of宏;第2步再去理解这个宏的实现原理(见图2)。
31.3.学习指南和要求
(1)基本要求:必须要掌握这两个宏的使用,即知道这两个宏接收什么参数,返回什么值,会用这两个宏来写代码,看见代码中别人用这两个宏能理解什么意思。
(2)升级要求:能理解这两个宏的工作原理,能表述出来,有些面试笔试题会这么要求。
(3)高级要求:能自己写出这两个宏,不要着急,慢慢来。
(1)作用:用宏来计算结构体中某个元素和结构体首地址的偏移量(其本质是通过编译器来帮我们计算)。
(2)原理:我们虚拟1个type类型结构体变量,然后用type.member的方式来访问某个member元素,继而得到member相对于整个变量首地址的偏移量。
(3)学习思路:第1步先学会用offsetof宏;第2步再去理解这个宏的实现原理(见图1)。
31.2.container_of宏
(1)作用:知道某个结构体中某个元素的指针,反推整个结构体变量的指针,继而得到结构体中其它元素的指针。
(2)typeof关键字:typeof(a)即由变量a得到a的类型,typeof就是由变量名得到变量的数据类型。
(3)原理:先用typeof得到member元素的类型,然后通过该类型定义指向member元素的指针,然后用该指针减去该元素相对于整个结构体变量的偏移量(偏移量用offsetof宏得到)后得到整个结构体变量的首地址,再把该地址强制类型转换为type *即可。
(3)学习思路:第1步先学会用container_of宏;第2步再去理解这个宏的实现原理(见图2)。
31.3.学习指南和要求
(1)基本要求:必须要掌握这两个宏的使用,即知道这两个宏接收什么参数,返回什么值,会用这两个宏来写代码,看见代码中别人用这两个宏能理解什么意思。
(2)升级要求:能理解这两个宏的工作原理,能表述出来,有些面试笔试题会这么要求。
(3)高级要求:能自己写出这两个宏,不要着急,慢慢来。
相关文章推荐
- HDU 5235 Friends (2015 Multi-University Training Contest 2 搜索+剪枝)
- POJ 2010 Moo University - Financial Aid
- 【BZOJ-2434】阿狸的打字机 AC自动机 + Fail树 + DFS序 + 树状数组
- linker command failed with exit code 1)错误总结
- 70. Climbing Stairs
- 本地socket unix domain socket
- 杭电1022Train Problem I
- A. Dreamoon and Stairs(Codeforces Round #272)
- QPainter 使用注意事项
- 杭电1021Fibonacci Again
- 解决sublimeText3无法安装插件有关问题 - There are no packages available for installation
- LeetCode Palindrome Pairs
- 服务器TIME_WAIT和CLOSE_WAIT详解和解决办法
- Tensorflow 官方版教程中文版
- 解决time_wait过多的问题
- 2016微软开发者大会 - 简洁收集
- 70. Climbing Stairs
- RAID各级别特性
- 学习笔记之RAID各级别特性
- wait()、notify()、notifyAll()