当前位置: 首页 > news >正文

container_of宏

在linux 内核中有一个大名鼎鼎的宏container_of(),这个宏是用来干嘛的呢?我们先来看看它在内核中是怎样定义的。

呵呵,乍一看不知道是什么东东。

我们先来分析一下container_of(ptr,type,member),这里面有ptr,type,member分别代表指针、类型、成员。看一个例子:

Struct test
{
    int i;
    int j;
    char k;
};
Struct test temp;

现在呢如果我想通过temp.j的地址找到temp的首地址就可以使用container_of(&temp.j,struct test,j);

现在我们知道container_of()的作用就是通过一个结构变量中一个成员的地址找到这个结构体变量的首地址。

下面来看看比较复杂的内容:

我们用上面的struct test张展一下

Const typeof(((struct test *)0)->j) * __mptr = (&temp.j);

其中,typeof是GNU C对标准C的扩展,它的作用是根据变量获取变量的类型。因此,上述代码的作用是首先使用typeof获取结构体成员j的类型为int,然后顶一个int指针类型的临时变量__mptr,并将结构体变量中的成员的地址赋给临时变量__mptr。

(struct test *)((char *)__mptr - offsetof(struct test,j));

接着我们来看一下offsetof(struct test,j),他在内核中如下定义

展开(size_t)&((struct test *)0)->j,这是什么东东?

一开始也不明白,这里要感谢曹忠明老师的热心帮助,一语惊醒梦中人,呵呵,可以是这样理解。

其中size_t是整型,那么我们可以知道最终的结果是一个整形值,也就是j相对于0地址的偏移量。也许现在你会问,整出这么个玩意干嘛,下面看个列子:

程序运行结果:

发现没有如果把第二个值 减去最后一个值,就能得到第一个值。

在回首一下它:

(struct test *)((char *)__mptr - offsetof(struct test,j));

注意的是代码高亮处 ,(char *)__mptr 的作用是将__mptr强制转换为字符指针类型,必须的!! 如果_mptr为整形指针 __mptr - offset 相当于减去 sizeof(int)*offset个字节!!!

 

原文作者:程姚根

 

转载于:https://www.cnblogs.com/hicjiajia/archive/2012/07/01/2571791.html

相关文章:

  • 黑马程序员——关于接口和抽象类
  • 一阶负反馈的补偿特性
  • Freemark List 倒序输出
  • 如何访问一个类的保护变量
  • 一个简单的管理Web站点文件的页面程序(修改版)
  • 一个简单的库存控制模型
  • S型增长实例
  • js 弹出DIV层和关闭DIV层
  • 阻尼摆运动的系统动力学VENSIM模拟仿真
  • C# 指针之美
  • 传染病模型系统动力学VENSIM模拟
  • C++ 随机数函数
  • 架构师的行为准则(一)
  • SQLITE入门-逐步讲解SQLITE命令行(一)
  • 架构师的行为准则(二)
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • CODING 缺陷管理功能正式开始公测
  • Elasticsearch 参考指南(升级前重新索引)
  • JavaScript HTML DOM
  • JavaScript设计模式系列一:工厂模式
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • js中forEach回调同异步问题
  • Nodejs和JavaWeb协助开发
  • Terraform入门 - 1. 安装Terraform
  • win10下安装mysql5.7
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 创建一种深思熟虑的文化
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • ------- 计算机网络基础
  • 开源地图数据可视化库——mapnik
  • 前端工程化(Gulp、Webpack)-webpack
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 数据结构java版之冒泡排序及优化
  • 系统认识JavaScript正则表达式
  • 项目管理碎碎念系列之一:干系人管理
  • 小李飞刀:SQL题目刷起来!
  • 译有关态射的一切
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • #{}和${}的区别是什么 -- java面试
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (bean配置类的注解开发)学习Spring的第十三天
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .Net FrameWork总结
  • .net MVC中使用angularJs刷新页面数据列表
  • .net 微服务 服务保护 自动重试 Polly
  • .NET 药厂业务系统 CPU爆高分析