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

C++数组地址偏移 C++中数组名可以作为数组的首地址使用。数组名是一个右值,不能对其进行自增或者自减处理,但是可以对其作为右值进行运算处理。对数组名进行运算处理可以看成是对数组地址进行了偏移,而偏移的单位可能是数组中元素的大小,也有可能是整个数组的大小。 阅读详情

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的值都是相同的。

VMware ESXi 系统里创建虚拟机,虚拟磁盘日志损坏,如何或者把数据备份? 🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 阅读详情

相关推荐

树莓派通过TTL3.3转485 Modbus采集水表

所需道具 树莓派0,我用的是树莓派zero wh; 具有光电直读功能的有线水表,我用的是咸鱼淘的埃美柯LXSY-20E1; TTL3.3 转 485模块,带隔离的贵些; 5V转12V升压模块。 原理 树莓派有UART(GPIO14 Tx 和 GPIO15 Rx)串口通讯功能,电器特性是3.3V TTL,直读远传水表支持M-Bus/485通讯接口,我买的光电直读水表485要求12V供电(根据仪表厂家说明书)。TTL和485虽然都是串口通讯,但电器特性不一样,不能直接接!我已经烧掉一个树莓派...

xhydongda的博客 3443

获取类成员偏移量

<br />第一种方式是MFC里使用广泛的宏:对空对象成员取地址<br />#define OFFSET(structure, member) ((int)&((structure*)0)->member); <br />正如我们平时通过某对象的地址指针访问某个成员变量一样,这里只是强制使用0作为该地址,但区别是并没有通过该地址去访问成员变量,而只是用&操作符来获取该成员变量的地址,所以不会出现访问违规的情况。<br />object member address = object address + me

QQIANQQ的专栏 1554

解决国内网页无法加载reCaptcha的方法

科普: reCaptcha是Google公司的验证码服务,方便快捷,改变了传统验证码需要输入n位失真字符的特点。reCaptcha在使用的时候是这样的: 只需要点一下复选框,Google会收集一些鼠标轨迹、网络信息、浏览器信息等等,依靠后端的神经网络判断是机器还是人,绝大多数验证会一键通过,无需像传统验证码一样。但是reCaptcha使用了google.com的域名,这个域名在国内是被墙的。所以,也就导致了官网上无法注册/登录的问题,挡住了不少人入正的脚步。 解决办法: 【第一步】安装fir

调皮李小怪博客 25万+

C++得到成员变量的偏移值

一:零地址转换 以下为MFC常用宏: #define OFFSET(structure, member) ((int)&((structure*)0)->member); #include #define GET(A,m) (int)(&((A*)0)->m); using namespace std; struct A{

ycf74514的专栏 3237

将一维数据(序列)转化为二维数据(图像)的方法汇总GAFS, MTF, Recurrence plot,STFT

虽然深度学习方法(1D CNN, RNN, LSTM 等)可以直接处理一维数据,但是当前的深度学习方法主要还是处理二维结构数据的,特别是在计算机视觉CV以及自然语言处理NLP领域,各种各样的方法层出不穷。因此,如果能够将一维序列数据转化为二维(图像)数据, 则可以直接结合CV以及NLP领域的方法,是不是很有趣! GAF, GASF, GADF, MTF, Recurrence Plot, STFT, 短时傅里叶变换

MasterQKK 5万+

保姆级教程:在RK3588开发板上编译带MPP硬件加速的FFmpeg(含完整依赖库配置)

本文提供在RK3588开发板上编译支持MPP硬件加速的FFmpeg的详细教程,涵盖交叉编译环境搭建、MPP框架及依赖库配置,最终实现4K视频硬件编解码性能优化。通过实战步骤和性能对比,展示如何充分发挥RK3588的硬件加速能力。

weixin_30839881的博客 418

C++获取成员变量的偏移地址

#include<iostream> #include<list> #include<string> #include<vector> using namespace std; class base { public: int m_i1; char m_c1; char m_c2; char m_c3; }; #define GET(A , m) (int)(&((A*)0)->m) int main() { cout<&

doubleintfloat的博客 4100

避坑指南:PCIe设备兼容性那些坑——聊聊MPS/MRRS设置不当引发的血泪史

本文深入探讨了PCIe设备兼容性问题,特别是MPS/MRRS参数设置不当引发的常见故障。通过详细解析MPS(Max Payload Size)和MRRS(Max Read Request Size)的作用机制,提供Linux内核五大配置策略的对比分析,并分享FPGA加速卡等实战案例的排查经验。文章还介绍了诊断工具链、动态调试技巧以及性能优化方法,帮助工程师有效解决PCIe兼容性难题。

weixin_30872499的博客 419

C++笔记-5-c++成员变量、函数指针

自学笔记,没有历史知识铺垫(省略百度部分)C++笔记-5-c++成员变量、函数指针本章主要为C++笔记-5-c++成员变量、函数指针。

宝全哥哥的博客 539

基于Simulink的防空导弹六自由度弹道建模与仿真实战

本文详细介绍了基于Simulink的防空导弹六自由度弹道建模与仿真方法。通过分析导弹动力学原理、Simulink环境配置、气动力建模、推进与控制系统设计等关键环节,提供了一套完整的实战指南。文章特别强调了六自由度模型在防空导弹仿真中的重要性,并分享了常见问题排查与优化建议,为相关领域工程师提供实用参考。

apple5的专栏 868

RICHARDSON-LUCY 去卷积简介

Lucy去卷积1.泊松过程及联合概率分布2.极大似然估计参考文献 1.泊松过程及联合概率分布 首先假设相机接收光子生成图像的过程符合泊松分布。 因此,一次曝光过程中,某像素位置接收到iii个光子的概率p(i)p(i)p(i)为: p(i)=exp⁡(−λ)⋅λii!\qquad\qquad p(i)=\exp(-\lambda)\cdot\cfrac{\lambda^{i}}{i!}p(i)=exp(−λ)⋅i!λi​ 那么针对一张M∗NM*NM∗N的图像,所有像素的联合概率分布可以描述为: P(I)=∏e

驽马十驾,功在不舍;锲而不舍,金石可镂。 8694

80 C++对象模型探索。数据语义学 - 数据成员布局-成员变量的地址规律,字节对齐问题,成员变量偏移值

/这里是声明一个static,并不是定义,声明不会分配空间int m_j;int m_k;//静态成员变量 不占用 类对象 的空间,实际上从上一节我们知道,静态成员变量是放在数据段或者BSS段的,也就是说,在编译阶段就已经确定了地址。//12//普通成员变量的存储顺序,是按照在类中的定义顺序从上到下 来的//如下的代码我们故意先给 m_k = 8,然后再m_j = 5;//堆上呢?

hunandede的博客 988

AI预测彩票,使用chatgpt和lstm神经网络(文末附源码)

AI预测彩票,使用chatgpt和lstm神经网络(文末有彩蛋)

淘淘小窝 1万+

(C++对象模型):成员变量地址、偏移、指针等重申

目录 对象成员变量内存地址及其指针 成员变量的偏移值及其指针(和具体对象无关) 没有指向任何数据成员变量的指针 对象成员变量内存地址及其指针 class MYACLS { public: int m_i; int m_j; int m_k; }; int main() { MYACLS myobj; myobj.m_i = myobj.m_j = myobj.m_k = 0; printf("myobj.m_i = %p\n", &myobj.m_i); //对象的

baidu_41388533的博客 869

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

《C++新经典对象模型》之第4章 数据语义学

4.1.2 成员函数参数类型的确定时机(最近碰到原则) 04.01.cpp 4.2 进程内存空间布局 最高内存地址 栈区(向下增长) 堆区(向上增长) 数据段(含BSS段) 代码段 最低内存地址进程虚拟地址空间(内存)划分: (1)栈(堆栈/栈区):局部变量等。 (2)堆(堆区):new、malloc等申请内存空间。 (3)BSS段:未初始化全局变量,初始化为0的全局变量。 (4)数据段:已初始化的全局变量,包含BSS段。 (5)代码段:存放程序执行代码。Linux上列出可执行文件中全局变量等存放位置的

yxqq378287007的博客 920

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C++ 新经典:对象模型——目录(先留框架,慢慢来~)

C++ 新经典:对象模型——目录

慢慢记录,慢慢更新。 958

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

成员变量地址、偏移、指针等重申

// project100.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include "pch.h" #include <iostream> #include <time.h > #include <stdio.h> #include <vector> using namespace std; class...

昔拉的博客 543

C++对象模型_第四章_C++数据语义学

下面的方式打印成员变量指针。// 16printf("pmyobj->m_n偏移值 = %d\n", mypoint);由于类内存模型会遵循字节对齐,以4字节对齐为例,如果一个变量不满足4字节,编译器会对这个内存进行填充到4字节。下面代码,将小内存的变量char 如果连续定义完后,再定义int,总内存8字节;如果int在char中间定义,总内存12字节。int m_i1;char m_c2;char m_c3;

weixin_43916755的博客 977

C++对象模型 第三章 数据语义学

第三章 数据语义学 文章目录数据成员绑定时机进程内存空间数据成员布局数据成员存取单一继承下的数据成员布局单类 单继承 下虚函数的数据成员布局多重继承数据布局与this调整深谈 !虚基类问题的提出和初探两层结构时虚基类表内容分析 —— 针对 VS 2017三层结构时虚基类表内容分析成员变量地址、偏移、指针等重申 数据成员绑定时机 总结: ==编译器对 成员函数myfunc的解析,是整个A类定义完毕后才开始;==因为只有整个类A定义完毕后, 编译器参能看到类A中的myvar,才能根据时机的需要把出现myva

qq_53111905的博客 777

C++对象模型之数据语义学

前言 本次笔记记录如下知识点 数据成员绑定时机 进程内存空间布局 数据成员布局 一、数据成员绑定时机 成员函数函数体的解析时机 如果成员变量和全局变量重复了,那么成员函数在内部调用时,会优先调用成员变量,因为编译器对函数体内部的变量进行解析时,是从整个类定义完成之后进行的。 如下示例 string myvar; class Base { public: int myfunc() { return myvar; } private: int myvar; }; int main()

qq_40223389的博客 253

87 C++对象模型探索。数据语义学 - 成员变量地址,偏移,指针 复习

对象的成员变量是有真正的内存地址的。三,没有指向任何数据成员变量的指针。对象成员变量内存地址及其指针。二,成员变量的偏移值及其指针。

hunandede的博客 503

4.11成员变量地址,偏移,指针等重申

#include <iostream> using namespace std; class MYACLS { public: int m_i; int m_j; int m_k; }; void myfunc(int MYACLS::* mempoint, MYACLS& obj) { obj.*mempoint = 260; //注意写法 } int main() { //一:对象成员变量内存地址及其指针 MYACLS myobj; myobj.m_i = m.

John的博客 283

C/C++中通过结构体/类中的某个成员变量的内存地址,获取其在结构体/类中的偏移量

引言 这段时间因为工作需要在研究开源工具Xdelta3的源码 ,发现了其中一个很有趣但不算常见的操作,先贴一下源码: static inline xd3_rinst *xd3_rlist_entry(xd3_rlist *l) { return (xd3_rinst *)((char *)l - (ptrdiff_t) & ((xd3_rinst *)0)->link); } 补充一下上面语句中出现的几个类型定义: typedef unsigned char uin

DJ_Macros的博客 3438

c 通过成员变量地址 获取类对象地址_C++对象模型与虚函数的理解

背景之前看过c++对象模型这本书,加上自己工作中的一些经验,做一下总结吧。首先,从我入职时做的第一个项目谈起吧,那是我的第一个项目,至今两三年了,但是记忆犹深啊。感谢我的师傅和合作伙伴老余。项目的背景是这样的:主机A是小端机器,主机B是大端机器,A和B之间互相通信,通信的协议是自定义的,实现语言为C/C++,他们之间的通信需要做字节序转换。由于项目初期,没有在AB发送消息之前做消息编码(比如,开源...

weixin_32696821的博客 509

C++ 虚指针、成员变量与类对象的偏移地址

本文根据对象中虚指针、成员变量、成员函数在类对象中的相对位置,分析并给出虚指针、成员变量在类对象的偏移地址分布情况及相关源码。

稚枭天卓 3517

C++ 数据语义学——数据成员布局

数据成员布局是指在内存中如何安排一个类或结构体的成员变量。它决定了每个成员变量在对象中的位置和顺序。数据成员布局的主要目的是优化内存访问效率和满足硬件对齐要求。

慢慢记录,慢慢更新。 605
上一篇: C++对象模型(6)-- 数据语义学:继承的对象布局(含虚函数)
下一篇: C++对象模型(8)-- 数据语义学:this指针
老蔡编程
博客等级 码龄23年 48粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值