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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 基于Amos路径分析的模型拟合参数详解[通俗易懂]

    基于Amos路径分析的模型拟合参数详解[通俗易懂]基于Amos路径分析的模型拟合参数详解1卡方、自由度、卡方自由度比2GFI、AGFI3RMR、RMSEA4CFI5NFI、TLI(NNFI)6ECVI7AIC、BIC、CAIC  前面两篇博客,分别对Amos的基本操作与模型、参数等加以详细介绍,点击下方即可进入对应文章。  博客1:基于Amos的路径分析与模型参数详解  博客2:基于Amos路径分析的输出结果参数详解  本文则将由模型拟合度指标入手,对Amos所得到的路径分析模型结果加以度量。1卡方、自由度、卡方自由度比  在模

  • mysql 多表删除

    mysql 多表删除

  • 【第二篇】Spring-Session实现Session共享Redis集群方式配置教程

    循序渐进,由易到难,这样才更有乐趣!概述本篇开始继续上一篇的内容基础上进行,本篇主要介绍Spring-Session实现配置使用Redis集群,会有两种配置方式,一种是Redis-Cluster,一种是Redis-Sentinel,并通过一个简单的demo进行实例演示!对Redis-Cluster和Redis-Sentinel不太懂,或者不知道在Windows下面如何搭建的…

  • 哈佛大学公开课-幸福课-个人笔记

    哈佛大学公开课-幸福课-个人笔记b站视频链接十一讲:养成良好习惯舒适区拉升区 慢慢的做出改变,一步步来。暴力区人的一生一般都是在舒适区度过的,你要让自己适度的走出然后走进拉升区。自律是有一定量的是有限的,用了可能就没有了,需要时间来恢复。我们不可能拥有很多自律,但同时自律也不是那么重要。老师比喻:1.AB—-榨菜与巧克力,A是巧克力-榨菜,B榨菜-巧克力 最后是A先吃了榨菜,因为A在克制自己不…

  • oracle 分页查询 优化_oracle分页查询封装

    oracle 分页查询 优化_oracle分页查询封装对于数据库中表的数据的 Web 显示,如果没有展示顺序的需要,而且因为满足条件的记录如 此之多,就不得不对数据进行分页处理。常常用户并不是对所有数据都感兴趣的,或者大部分情 况下,他们只看前几页。 通常有以下两种分页技术可供选择。 1234567Select * from (Select rownumrn,t.* from table t)Where rn>&minnum and rn或者Sel

    2022年10月26日
  • AUC的计算方法_auc计算器

    AUC的计算方法_auc计算器一、roc曲线1、roc曲线:接收者操作特征(receiveroperatingcharacteristic),roc曲线上每个点反映着对同一信号刺激的感受性。横轴:负正类率(falsepostiverateFPR)特异度,划分实例中所有负例占所有负例的比例;(1-Specificity)纵轴:真正类率(truepostiverateTPR)灵敏度,Sensitivity…

    2022年10月19日

发表回复

您的电子邮箱地址不会被公开。

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