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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mybatis2级缓存_java二级缓存

    mybatis2级缓存_java二级缓存1.概述转载:MyBatis二级缓存全详解上一篇文章中我们介绍到了MyBatis一级缓存其实就是SqlSession级别的缓存,什么是SqlSession级别的缓存呢?一级缓存的本质是什么呢?以及一级缓存失效的原因?我希望你在看下文之前能够回想起来这些内容。MyBatis一级缓存最大的共享范围就是一个SqlSession内部,那么如果多个SqlSession需要共享缓存,则需要开启二级缓存,开启二级缓存后,会使用CachingExecutor装饰Executor,进入一.

    2022年9月20日
    0
  • fast使用教程_ai基础教程入门图文

    fast使用教程_ai基础教程入门图文https://docs.fast.ai/如何利用好FASTAI——新版本fastai-v1.0快速入门https://m.oldpan.me/archives/fastai-1-0-quick-study

    2022年9月3日
    3
  • 1. qt 入门-整体框架[通俗易懂]

    1. qt 入门-整体框架[通俗易懂]总结: 本文先通过一个例子介绍了Qt项目的大致组成,即其一个简单的项目框架,如何定义窗口类,绑定信号和槽,然后初始化窗口界面,显示窗口界面,以及将程序的控制权交给Qt库。然后主要对Qt中的信号与槽机

    2022年8月4日
    9
  • 【SVN】SVN服务器搭建,客户端使用,在VS Code 中使用SVN

    【SVN】SVN服务器搭建,客户端使用,在VS Code 中使用SVN1.软件下载http://subversion.apache.org/packages.html#windows①VisualSVN服务端②TortoiseSVN客户端③Chinese,simplified语言包④vscode下载2.在vscode使用svn①在vscode里面下载TortoiseSVNforVSCode插件②配置svn环境变量和在……

    2022年7月19日
    23
  • java 缓存 工具类

    java 缓存 工具类

    2022年2月23日
    54
  • WinRAR怎么去广告

    WinRAR怎么去广告每次使用WinRAR都弹出一个广告,实在是烦人,遂破之。我使用的版本是:5.60(64位)目前最新版本是5.61第一种方法(本人亲测不可用):既然不可用,为什么还要说呢,可能是之前的老版本可用,现在的新版本就算注册了也会弹广告,如果你用的是老版本,不妨试一下这个方法,毕竟此方法最简单新建一个文本名字为rarreg.key,内容如下:RARregistrationdataFede…

    2022年6月7日
    23

发表回复

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

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