C++ offsetof

C++ offsetof这是一个宏,用于计算类中某个成员的地址相对于类实例的偏移量在C++11中,要求这个类standard_layout基本用法是这样子的:#include<stdio.h>/*printf*/#include<stddef.h>/*offsetof*/structfoo{chara;ch…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

这是一个宏,用于计算类中某个成员的地址相对于类实例的偏移量

在C++11中,要求这个类standard_layout

基本用法是这样子的:

#include <stdio.h>      /* printf */
#include <stddef.h>     /* offsetof */

struct foo {
    char a;
    char b[10];
    char c;
};

int main ()
{
    printf ("offsetof(struct foo,a) is %d\n",(int)offsetof(struct foo,a));
    printf ("offsetof(struct foo,b) is %d\n",(int)offsetof(struct foo,b));
    printf ("offsetof(struct foo,c) is %d\n",(int)offsetof(struct foo,c));

    printf("%d\n", &(((struct foo*)0)->c));
    
    return 0;
}

注意除了用offsetof宏之外, printf(%d\n“, &(((struct foo*)0)->c));也是一种办法

求取某个特定成员的偏移量的意义在哪儿呢?

linux内核中对于这一特性有一个绝佳的应用。内核数据结构中用到了很多的双向链表,进程描述符、页面描述符等等,它们各自被定义成不同

的结构体类型,但就双向链表这一数据结构而言,操作却是完全一致的,听起来该是c++模板大显身手的地方了。

于是就想到定义这样一种链表节点:

struct list_head
{
    struct list_head *next, *prev;
};

需要使用双向链表的类型就会含有这样的成员,比如:

typedef struct page
{
    struct list_head list;
    .....
    struct page *next_hash;
   .....
    struct list_head lru;
}mem_map_t;

这里面的成员(list或者lru)都会与其它page结构体中对应的链表节点成员相连,相当于成为一个连接件。

问题是我们要的是两个page结构之间相连,你弄成它们的成员相连,怎么用呢??

这就是offsetof大显身手的时候了,有了它,我们在知道成员地址之后,能求出page实例的基地址,从而

变相的实现了将两个page连接在一起的目的,同时复用了双链表这一基本数据结构。

转载于:https://www.cnblogs.com/hustxujinkang/p/5034204.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/172095.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Mysql truncate 清空表数据「建议收藏」

    Mysql truncate 清空表数据「建议收藏」truncate:清空指定表中的所有数据,并将表恢复到”初始状态”,就跟刚创建的表一样。truncate表名;测试数据:mysql>select*fromtest;+—-+——-+——+——+|id|name|sex|age|+—-+——-+——+——+|1|name1|男|5||2|name2|女|10||3|name..

    2022年5月30日
    40
  • ASP开发中存储过程应用全接触

    ASP开发中存储过程应用全接触

    2021年7月25日
    54
  • 大数据项目实训教学解决方案

    大数据项目实训教学解决方案大数据项目实训教学解决方案【课程资源】大数据项目实训和课程设计课程体系中职、高职还有本科,实训教学最关键的要素都是课程资源。唯众以大数据基础课程、核心技术课程为基础,以大数据产业实际应用案例为原型,遵照院校实训教学规范,开发了一系列的项目实训、课程设计课程资源,基本满足各院校大数据实训教学需求。【软件系统】大数据教学云平台大数据教学云平台是一个开放式的课程平台,除了唯众的课程体系之外,老师可自主开发在线课程,支持Word、PPT、PDF、视频等常见课件直接转换成在线课程,从而让老师很方便的将专业基

    2022年5月11日
    41
  • docker(6)镜像的使用「建议收藏」

    docker(6)镜像的使用「建议收藏」前言Docker的三大核心概念:镜像、容器、仓库。初学者对镜像和容器往往分不清楚,学过面向对象的应该知道类和实例,这跟面向对象里面的概念很相似我们可以把镜像看作类,把容器看作类实例化后的对象。|

    2022年8月6日
    6
  • java的动态代理机制详解_java为什么是静态语言

    java的动态代理机制详解_java为什么是静态语言说起java动态代理,在我刚开始学java时对这项技术也是十分困惑,明明可以直接调通的对象方法为什么还要使用动态代理?随着学习的不断深入和工作经验的积累,慢慢的体会并理解了java动态代理机制。昨天再给公司新同事做技术培训时有同学就对动态代理产生了疑问,我这里梳理一遍一并记录一下,方便大家查看对自己也是加深记忆。(1)什么是代理?大道理上讲代理是一种软件设计模式,目的地希望能做到代码重用。具体上讲…

    2022年10月9日
    4
  • Unity零基础到入门 ☀️| Unity从青铜 到 王者!只差这篇让你学会Unity中最重要的部分——脚本组件✨

    Unity零基础到入门 ☀️| Unity从青铜 到 王者!只差这篇让你学会Unity中最重要的部分——脚本组件✨从倔强青铜到荣耀王者!只差这篇让你学会Unity中最重要的部分——脚本组件✨。本篇内容对Unity脚本做了一个超级详细的介绍,从开发工具到具体实例,API等都有介绍。

    2022年4月30日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号