container_of 根据成员变量获得包含其的对象的地址!

2023-05-16

写在前面

本系列文章的灵感出处均是各个技术书籍的读后感,详细书籍信息见文章最后的参考文献

CONTAINER_OF

在书中发现一个很有意思的宏,以此可以衍生出来其很多的用法,这个宏可以根据某个成员变量的地址得到包含这个成员变量地址的对象的地址。但是,这个过程很危险,慎用哦!

我们先看这个宏的一个依赖宏:OFFSET_OF,它可以方便的获取此成员变量在这个对象之中的偏移量。

/*
 * @brief OFFSET_OF  获得member在type类型里面的偏移量
 * @param[in] Type: 类型
 * @param[in] MEMBER: 成员变量的名称
 */
#define OFFSET_OF(TYPE, MEMBER) ((size_t)&(static_cast<TYPE *>(0))->MEMBER)

CONTAINER_OF宏可以给定一个成员变量的地址,指定这个成员变量属于哪个对象,指定这个成员变量在对象之中的名称。

/**
 * @brief CONTAINER_OF - 通过三个参数,返回指向数据结构的指针
 * @param[in] ptr:	数据结构中指向某一成员的指针
 * @param[in] type:	数据结构类型
 * @param[in] member:	在数据结构中的成员
 * @note CONTAINER_OF 可以根据某个成员变量的地址得到包含这个成员变量地址的对象的地址。这个过程很危险慎用哦!
 * @return 成员变量的地址
 */
#define CONTAINER_OF(ptr, type, member) ({			\
	const typeof( (static_cast<type*>(0))->member ) *__mptr = (ptr);	\
	(type *)((char*)__mptr - OFFSET_OF(type,member) );})

Demo

int main(){
    foo my_foo;
    foo *p = CONTAINER_OF(&my_foo.a, struct foo, a);
    cout<<p<<endl;
}

输出:

0x7ffc75b6dfc0

其他用法

根据作者在书中所属,这个宏被用于以下几种情形:

  1. 引用计数:对于引用计数结构,可以传递给引用计数一个回调函数,回调函数之中根据这个引用计数对象的地址倒推出包含引用计数的父对象的地址,从而释放资源
//这依赖myref_是对象的公有成员变量
void object_release(struct* ref){
    Object* object = CONTAINER_OF(ref, Object, myref_);
    free(object);
}
  1. 无关类型的双向链表:只要链表的元素之中包含这个node_ 指针,我们在释放的时候,其实就可以便利node_,调用CONTAINER_OF 去获取这个元素的地址,从而释放资源。
class Object{
public:
	some object...
	NodeUnit *node_;
};

参考文献

  1. 《存储技术原理分析》第二章 Linux驱动模型
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

container_of 根据成员变量获得包含其的对象的地址! 的相关文章

随机推荐

  • 浅谈设备驱动的作用与本质,有无操作系统Linux设备驱动的区别

    一 驱动的作用 任何一个计算机系统的运行都是系统中软硬件协作的结果 xff0c 没有硬件的软件是空中楼阁 xff0c 而没有软件的硬件则只是一堆废铁 硬件是底层基础 xff0c 是所有软件得以运行的平台 xff0c 代码最终会落实为硬件上的
  • 【转】多智能体系统一致性问题概述

  • 【转】从自然基金面上项目只许列10篇代表作说起

    作者 xff1a 喻海良 xff0c 字之亮 xff0c 2018年2月13日于北京沙河 关于建设 双一流大学 过程中 xff0c 我们作为大学教师该如何看待学术论文的讨论已经有很多了 个人觉得论文数量是基础 xff0c 一个大学教授的课题
  • 盘点 | 单目视觉3-D目标检测经典论文(附解读)

    2020年以来出现的一些单目视觉3 D目标检测的论文 本文针对部分典型的论文要点进行要点解读 xff0c 仅供参考 Towards Generalization Across Depth for Monocular 3D Object De
  • IBM的云平台Bluemix使用初体验-创建第一个容器

    概述 第一次使用IBM的云平台Bluemix xff0c 写一个blog记录一下 我注册Bluemix挺早的 xff0c 但是在工作中一直没有机会使用IBM的云平台 现在辞职创业 xff0c 做自己喜欢的互联网 xff0c 终于有机会用上了
  • 在Source Insight中添加对.cc的支持

    Options gt Document Options Document Type gt 下拉选择 xff1a C 43 43 Source File 在File Filter 中加入 cc
  • Android HFP流程记录

    DP 完成后 xff0c btif dm c文件中 xff0c btif dm search services evt函数 xff0c bond state changed BT STATUS SUCCESS amp bd addr BT
  • OPP文件传输

    在RFCOMM连接后 xff0c 进行Command Type Parameter Negotiation时 xff0c 会协商Credits初始值 建立OBEX连接时 xff0c 会将poll bit设置 xff0c 用于Given Cr
  • 算法——欧几里得算法

    目录 欧几里得算法算法原理欧几里得算法的代码表示 参考文献 欧几里得算法 欧几里得算法是用来求两个正整数最大公约数的算法 古希腊数学家欧几里得在其著作中 The Elements 中最早描述了这种算法 xff0c 所以叫欧几里得算法 a s
  • 算法——100瓶水,一瓶有毒,有一种试纸...

    问题描述 100瓶水 xff0c 一瓶有毒 xff0c 有一种试纸 xff0c 不过需要一个小时才能出结果 xff0c 问最少需要几片试纸才能在一小时内找到有毒的那一瓶 答案 span class token number 7 span 算
  • 基于muduo网络库的集群聊天系统(C++实现)

    文章目录 项目概述业务流程 数据模块表的设计数据库模块设计 通信格式网络和业务模块网络模块网络模块和业务模块解耦合业务模块注册业务登录业务加好友业务一对一聊天业务创建群业务加入群业务群聊业务注销业务 服务器集群跨服务器通信集群聊天服务器的思
  • linux设备驱动原理与本质

    任何计算机系统都是软件和硬件的结合体 xff0c 如果只有硬件而没有软件 xff0c 则硬件是没有灵魂的躯壳 xff1b 如果只有软件没有硬件 xff0c 则软件就是一堆无用的字符 在底层硬件的基础上 xff0c 操作系统覆盖一层驱动 xf
  • pycharm配置可视化界面流程简介

    一 安装QT Designer 在pycharm的终端里面输入如下命令 span class token comment 安装pyqt5 span pip install PyQt5 span class token comment 安装p
  • 内存——CPU、内存以及磁盘是如何交互的

    文章目录 内存的存储SRAMDRAMDRAM内部以及与内存控制模块的交互 xff08 重点 xff09 DRAM与内存存储CPU和内存的交互 xff08 重点 xff09 磁盘磁盘和CPU 内存的交互 局部性参考文献 之前在介绍linux
  • libco —— 安装与使用

    文章目录 libco的安装libco库的简单使用参考文献 libco的安装 可以直接从 Tencent 的 GitHub 仓库中拉取源码 xff1a ubuntu 64 VM 0 2 ubuntu libco span class toke
  • 为什么我的云服务器不能绑定公网 ip ?

    文章目录 云服务器的部署 xff1a 数据中心NAT协议开头问题的答案参考文献 写在前面 昨天呢 xff0c 在校招群里的小伙伴问了我们一个问题 xff0c 让我们帮给看看 xff1a 一开始呢 xff0c 博主按照经验呢跟他说是端口号被占
  • 汇编 —— 算术和逻辑操作

    文章目录 加载有效地址leaq 练习题练习题答案 一元操作符 amp 二元操作符一元 amp 二元 练习题练习题答案 移位操作移位练习题练习题答案 特殊的算数操作符练习题练习题答案 参考文献 写在前面 xff1a 从腾讯实习回来之后 xff
  • clang-format安装配置与vscode支持

    文章目录 calng format安装centos下clang format安装ubuntu下clang format的安装vscode支持clang format clang format使用参考文献 calng format安装 cen
  • 分布式共识算法 —— Raft详解

    文章目录 分布式共识算法顺序一致性线性一致性因果一致性 Raft 算法原理概览选举机制新节点加入leader 掉线处理多个 follower 同时掉线 日志复制 参考文献 分布式共识算法 首先我们先明确这个问题 xff1a 为什么需要分布式
  • container_of 根据成员变量获得包含其的对象的地址!

    写在前面 本系列文章的灵感出处均是各个技术书籍的读后感 xff0c 详细书籍信息见文章最后的参考文献 CONTAINER OF 在书中发现一个很有意思的宏 xff0c 以此可以衍生出来其很多的用法 xff0c 这个宏可以根据某个成员变量的地