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


相关推荐

  • centos7安装vim命令(vim命令怎么退出)

    那么如何安裝vim呢?输入rpm-qa|grepvim命令,如果vim已经正确安裝,会返回下面的三行代码:root@server1[~]#rpm-qa|grepvimvim-enhanced-7.0.109-7.el5vim-minimal-7.0.109-7.el5vim-common-7.0.109-7.el5

    2022年4月12日
    44
  • 运维必须掌握的27道Linux面试题

    运维必须掌握的27道Linux面试题1.解释下什么是GPL,GNU,自由软件?GPL:(通用公共许可证):一种授权,任何人有权取得、修改、重新发布自由软件的权力。GNU:(革奴计划):目标是创建一套完全自由、开放的的操作系统。自由软件:是一种可以不受限制地自由使用、复制、研究、修改和分发的软件。主要许可证有GPL和BSD许可证两种。 2.如何选择Linux操作系统版本?一般来讲,桌面用

    2022年5月13日
    69
  • python用于表示逻辑非运算_python and运算符

    python用于表示逻辑非运算_python and运算符在看python的时候逻辑运算符没看懂。xandy布尔”与”-如果x为False,xandy返回x的值,否则返回y的计算值。(aandb)返回20就这一段话,看的我有点懵逼,然后我就去上网搜了别人的解说,然后写了一篇文章,供大家理解。先学习其他语言里的与或非。短路与(逻辑与)和非短路与。或也是如此,不在重复,接下来拿与举例子。一.短路与(逻辑与)和非短路与先来…

    2022年10月8日
    3
  • 公网IP和内网IP如何分辨?

    公网IP和内网IP如何分辨?公网ip和内网ip之间如何分辨,公网ip和内网ip之间有什么区别?很多人都知道根据网络使用的范围不同又分为公有网络和私有网络。公有网络就是指处于公有网络的电脑的IP是“互联网”中能够识别到的地址;而私有网络指公有网络的机器不能识别到的机器。本文主要给大家介绍公网ip和内网ip的相关知识。

    2022年4月29日
    59
  • UML类图介绍

    UML类图介绍文章目录UML类图一、类图概述二、类图的作用三、类图表示法1.类的表示方式2.类与类之间关系的表示方式2.1关联关系2.2聚合关系2.3组合关系2.4依赖关系2.5继承关系2.6实现关系UML类图一、类图概述类图显示了模型中存在的类、类的内部结构以及它们与其他类的关系二、类图的作用类图描述了系统的类的集合,类的属性和类之间的关系,可以简化了人们对系统的理解三、类图表示法1.类的表示方式在UML类图中,类使用包含类名、属性和方法且带有分割线的矩形来表示比如下图表示一个Emp

    2022年7月14日
    16

发表回复

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

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