C++对象模型(7)-- 数据语义学:成员变量偏移值、地址

1、成员变量偏移值

(1)

成员变量偏移值,就是指这个成员变量的地址离对象首地址偏移了多少字节,这个偏移值在编译完成后是不变的。

class Base {
public:int b_i;int b_j;
};int main()
{Base base;printf(" b_i的偏移值:%d\n", &Base::b_i);printf(" b_j的偏移值:%d\n", &Base::b_j);return 0;
}

根据前面所学的知识,我们知道这个Base类的对象布局如下所示:

变量b_i在对象的开头位置,所以偏移值应该为0;int类型的长度是4,所以b_j的偏移值应该为4。

执行程序后,输出结果如下:

(2)

下面我们给Base类添加1个虚函数,看这个时候b_i、b_j的偏移值是多少?

class Base {
public:int b_i;int b_j;virtual void print(){}
};

这个时候Base类对象的开头位置会增加一个4字节的虚函数表指针,b_i、b_j的位置会往下移动4个字节。这时,b_i的偏移值应该是4,b_j的偏移值

应该是8。

执行程序后,输出结果如下:

2、成员变量地址

类的静态变量,是跟着类走的,它的地址在编译后是不变的。

类的非静态变量,是在类对象里的,每次运行生成一个新对象,它的地址就会发生变化。

我们可以用下面的代码做个验证:

class Base {
public:int b_i;int b_j;static int b_s;
};
int Base::b_s = 1;int main()
{Base base;printf(" b_i的地址:%d\n", &base.b_i);printf(" b_j的地址:%d\n", &base.b_j);printf(" b_s的地址:%d\n", &base.b_s);return 0;
}

运行发现变量b_i、b_j的地址每次都不一样,但b_s的值都是相同的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/99155.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于深拷贝和浅拷贝你需要了解的内容

深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是在复制对象或数据结构时使用的两种不同的策略,它们的主要区别在于复制后新旧对象之间的关系以及对嵌套对象的处理方式。 浅拷贝: 浅拷贝创建一个新对象&#xff…

C#WPF属性元素语法应用实例

本文介绍C#WPF属性元素语法应用实例 一、属性元素语法 对于对象元素的某些属性,无法使用特性语法(比如:Background="Blue"),因为无法在特性语法的引号和字符串限制内充分地表达提供属性值所必需的对象或信息。 对于这些情况,可以使用另一个语法,即属性元素语…

计算机专业毕业设计项目推荐14-文档编辑平台(SpringBoot+Vue+Mysql)

文档编辑平台(SpringBootVueMysql) **介绍****各部分模块实现** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设计流程以及模式,在编写的…

Linux 基金会分叉 Terraform,正式推出 OpenTofu

Linux 基金会宣布推出 OpenTofu,这是一个 Terraform 的开源替代方案,并且分叉自 Terraform。OpenTofu 原名 OpenTF,为所有人提供了一个在中立治理模式下的可靠的开源替代方案。 Terraform 是 HashiCorp 开源的一个安全和高效的用来构建、更改…

内网渗透——哈希传递

文章目录 哈希传递1. 概念1.1 LM1.2 NTLM 2. 原理3. 利用3.1 hash传递浏览上传文件3.2 hash传递获取域控RDP 4. 总结 哈希传递 哈希传递攻击(Pass The Hash)是基于 NTLM 认证缺陷的一种攻击方式,攻击者可以利用用户的密码哈希值来进行 NTLM …

Linux- 使用ssh远程连接

1. Linux上安装ssh 如果在Linux系统上运行sudo service ssh status提示Unit ssh.service could not be found.,这意味着SSH服务没有安装或者它可能在系统上有一个不同的服务名称。 下面,我们来介绍ssh的安装步骤: 安装SSH服务: 在不同的Lin…

提升微信小程序MAU,这些方法你需要落地执行

面对激烈的微信小程序竞争,如何提升微信小程序的月活跃用户量(MAU)是每个小程序运营者需要思考的问题。经过分析,提升微信小程序MAU可以从以下几个方面着手。更多提升微信小程序MAU相关,可某薇找我名字。 提升微信小程序MAU 第一,丰富小程序功能,提升用户黏性。可以…

flutter开发实战-video_player插件播放抖音直播实现(仅限Android端)

flutter开发实战-video_player插件播放抖音直播实现(仅限Android端) 在之前的开发过程中,遇到video_player播放视频,通过查看video_player插件描述,可以看到video_player在Android端使用exoplayer,在iOS端…

GPU问题:Unable to determine the device handle for gpu: Unknown Error

问题 linux服务器使用nvidia-smi出现 ((Unknown Error)) ,无法识别到对应bus-id的设备。 Unable to determine the device handle for gpu 0000:49:00.0: Unknown Error解决 可以重启解决,重新识别bus-id对应的设备。 我们的服务器可能是由于0号卡过热…

笔记34:转置卷积 Transposed Convolution 的由来

注:该文章为视频课的笔记补充 视频课:转置卷积(transposed convolution)_哔哩哔哩_bilibili 更详细的推导在:抽丝剥茧,带你理解转置卷积(反卷积)_逆卷积-CSDN博客 a a a 补充1…

命令模式,命令 Command 类对象的设计(设计模式与开发实践 P9)

文章目录 命令举例撤销C# 例子 命令 命令模式 Command 指的是一个 执行某些特定事情的指令 应用场景:有时需要向某些对象发送请求,但并不知道请求的接受者是谁,也不知道被请求的操作是什么。这时候命令模式就负责使发送者和接受者之间解耦 …

华为OD机试真题【服务器能耗统计】

1、题目描述 【服务器能耗统计】 服务器有三种运行状态:空载、单任务、多任务,每个时间片的能耗的分别为1、3、4; 每个任务由起始时间片和结束时间片定义运行时间; 如果一个时间片只有一个任务需要执行,则服务器处于单任务状志; 如果一个时间片有多个任务需要执行,则服务器处于…

Atcoder Regular Contest 165

B. Sliding Window Sort 2 被题目名里的滑动窗口误导了,于是卡 B 40min /fn Description 给定长度为 \(n\) 的排列 \(P\) 和一个整数 \(K\)。一次操作定义为选择一个长度为 \(K\) 的区间,对原排列的这段区间升序排序,其余位置不变。 你要执行…

九大装修收纳空间的设计,收藏备用!福州中宅装饰,福州装修

如果房子面积不大,收纳设计就显得非常重要。其实装修房子中很多地方都可以做收纳,九大空间每一处都可以放下你的东西,让你摆脱收纳烦恼。 收纳空间少的话,装修完后住久了怕会乱成一窝,因此装修的时候,收纳…

java spring cloud 工程企业管理软件-综合型项目管理软件-工程系统源码

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展,企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性,公司对内部工程管…

3D模型格式转换工具HOOPS Exchange助力Halocline开发VR

挑战: 支持客户群使用各种CAD系统和CAD文件格式。快速准确的加载可视化硬件数据。提供访问模型详细信息,同时确保高帧频性能。 结果: 确保支持标准文件格式和来自领先工程软件包的CAD数据。 通过查看简化模型或根据需要访问高层次的细节&am…

面试题20231008

前端 2023年前端面试题汇总-CSDN博客 后端 1.Java基础 容器、线程等等 a.JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境。 JRE:Java Runtime Envir…

Flutter安卓混淆的相关问题

当你执行 build apk 后,flutter会默认进行混淆,若你的应用中引用了第三方的sdk,在debug模式下没问题,但在release下可能就会出现各种各样的问题,找不到某个类,或者某个功能无法使用,甚至直接崩溃…

【多线程案例】设计模式-单例模式

1.单例模式 什么是单例模式? 所谓单例,即单个实例。通过编码技巧约定某个类只能有唯一一个实例对象,并且提前在类里面创建好一个实例对象,把构造方法私有化,再对外提供获取这个实例对象的方法,&#xff0…

嵌入式养成计划-31-网络编程----TCP的并发服务器模型------IO模型--IO多路复用

六十七、 TCP的并发服务器模型 67.1 循环服务器模型 一次只能处理一个客户端,当上一个客户端退出后,才能处理下一个客户端缺点:无法同时处理多个客户端 代码模型 sfd socket(); bind(); listen(); while(1){newfd accept();while(1){re…