C++对象模型(4)-- 数据语义学:数据成员的内存布局

C++对象模型之简述C++对象的内存布局 在C++中,有两种类的成员变量:static和非static,有三种成员函数:static、非static和virtual。那么,它们如何影响C++的对象在内存中的分布呢? 当存在继承的情况下,其内存分布又是如何呢? 下面就一个非常简单的类,通过逐渐向其中加入各种成员,来逐一分析上述两种成员变量及三种成员函数对类的对象的内存分布的影响。 注:以下的代码的测试结果均是基于Ubuntu 14.0 阅读详情

1、数据成员的声明顺序和内存布局

变量的布局顺序与它的声明顺序是一致的。

我们先来看一段代码:

class Base {
public:
    // 变量地址
    void print() {
        cout << " this:" << this << endl;
        cout << " &i1:" << &i1 << endl;
        cout << " &i2:" << &i2 << endl;
        cout << " &i3:" << &i3 << endl;
    }
    // 变量偏移量
    void print_offset() {
        printf(" Base::i1 = %d\n", &Base::i1);
        printf(" Base::i2 = %d\n", &Base::i2);
        printf(" Base::i3 = %d\n", &Base::i3);
    }

private:
    int i1;
    int i2;
    int i3;
};

int main()
{
    Base base;
    base.print();
    printf("\n");
    base.print_offset();
}

我们看到输出的地址是这样的:

从这些地址我们可以看到,变量的布局顺序与它的声明顺序是一致的。

下面我们把变量的声明修改一下,分别看一下修改后的输出地址。

(1)

int i1;
static int is;
int i2;
int i3;

(2)

int i1;
void print2();
int i2;
int i3;

(3)

public:
    int i1;
private:
    int i2;
    int i3;

从测试结果看,变量i1, i2, i3的输出顺序并没有发生变化,我们可以得出这样的结论:

(1)变量的访问属性public, protected, private对变量的布局顺序没有影响;

(2)变量中间添加static变量和成员函数对变量的布局顺序也没有影响。

2、字节对齐对数据成员内存布局的影响

(1)比如我们声明如下的变量:

这里我说明下,int占4个字节,short占2个字节。

int i1;
short s1;
int i2;
short s2;

输出地址是这样的:

内存布局是这样的:

(2)现在我们把变量的声明顺序修改一下:

int i1;
int i2;
short s1;
short s2;

输出地址是这样的:

内存布局是这样的:

MATLAB 论文复现——含氢综合能源系统多目标最优折中分布鲁棒低碳调度 提出基于多目标决策理论和逼近理想解排序技术,构造综合考虑系统调度的经济性、低碳性和鲁棒度的多目标最优折中函数,从而建立含氢综合能源系统多目标最优折中分布鲁棒低碳调度模型,可快速准确地获得兼具经济性、低碳性和鲁棒性的含氢综合能源系统优化调度方案。[1]孙惠娟,胡紫平,彭春华,等.含氢综合能源系统多目标最优折中分布鲁棒低碳调度[J/OL].电力自动化设备,1-13[2024-07-26].https://doi.org/10.16081/j.epae.202406003.关键词: 综合能源系统; 阅读详情

相关推荐

T型三电平关管顺序要求

摘要: T型三电平拓扑中,IGBT关断必须遵循“外管先关、内管后关”的时序,否则易导致器件损坏。正常导通时,外管与内管共同分担电压;正确关断时,外管先关使电流经内管续流至中点,避免电压过冲;若内管先关,电流路径被强制切断,杂散电感引发高压尖峰击穿器件。这一时序本质是为电流提供低应力续流路径,需通过硬件或软件严格保障。

yun0804的博客 2374

C++ 类中数据成员分布详解

概述 我们都知道类中包含着数据成员,但是数据成员在内存中是怎样分布的呢?继承之后数据又是怎样布局的呢?下面对这些问题进行整理。类的空间分布是编译器编译的结果,不同的编译器有可能会不一样,但是原理是一样的。 1、空类 我们定义了一个空类,然后对空类进行sizeof计算,如下: class myclass { }; cout &amp;amp;amp;amp;amp;amp;lt;&amp;amp;amp;amp;amp;amp;lt; sizeof myclass &a

weixin_39640298的博客 5476

二阶锥松弛在配电网最优潮流计算中的应用(IEEE33节点配电网最优潮流算例matlab程序)(yalmip+cplex)

文献[7]建立了以支路潮流计算为基础的OPF模型,针对OPF中的非凸性约束,采用SOCR技术将其松弛为二阶锥约束,整个 OPF 模型则被转化为二阶锥规划( Second Order Cone Programming,SOCP)问题,对其求解可以得到全局最优解。其次结合辐射型配电网潮流特点建立支路潮流约束,并考虑配电网中的可控单元,包括分布式电源和离散、连续无功补偿装置,建立其出力约束,该模型为非凸非线性模型;式中,αj,t和βij,t分别为t时段内节点i电压的二次方和支路ij电流的二次方。

weixin_47365903的博客 1万+

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

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

yxqq378287007的博客 920

带隙基准源要点

要点: 负反馈>正反馈;电流镜匹配;双极型晶体管匹配;电阻匹配; 经过R0的电流????????????=????????????????−????????????????????????=∆????????????????????i_R0=(〖VBE〗_1-〖VBE〗_2)/R_0 =∆VBE/R_0 经过R1的电流????????????=i_R1= ????????????????????VBE/R_1 零温电流I = ∆????????????????????∆VBE/R_0 +

HI_WALLE的博客 2263

Python爬取腾讯视频m3u8加密流实战(附完整代码)

本文提供了一份详细的Python实战教程,指导如何通过抓包分析、模拟请求头与载荷,破解腾讯视频的m3u8加密流防盗链机制,并附上完整代码实现视频片段的下载与合并。教程涵盖从侦察到代码实现的完整流程,并包含参数动态化、多线程下载等高级技巧与避坑指南,旨在帮助开发者掌握流媒体下载的核心技术。

weixin_29090089的博客 1598

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

Python 中 dpkt 库的详细使用指南(强大的 Python 数据包解析库)

dpkt 是一个功能强大的 Python 网络数据包解析库,支持解析和构造以太网、IP、TCP/UDP 等多种协议的数据包。其核心功能包括解析各层协议头部、读写 pcap 文件、构造自定义数据包及分析 HTTP 流量等。dpkt 提供简单易用的 API,适用于网络分析、安全研究和流量监控场景。优化技巧包括数据包过滤、批量处理和选择性解析以提高性能,常见问题如数据不完整或协议识别错误可通过异常处理和字段验证解决。典型应用场景涵盖协议分析、网络调试和自定义数据包生成。

数据知道的博客 1万+

深度探索C++对象模型之美

从概念来上来讲,每一个没有定义构造函数的类都会由编译器来合成一个默认构造函数,以使得可以定义一个该类的对象,但是默认构造函数是否真的会被合成,将视是否有需要而定。C++ standard 将合成的默认构造函数分为 trivial(不重要) 和 notrivial(重要) 两种,前文所述的四种情况对应于notrivial默认构造函数,其它情况都属于trivial。对于一个trivial默认构造函数,编译器的态度是,既然它全无用处,干脆就不合成它。

谢谢大家的关注 3494

【后量子密码】SPHINCS+ 算法(二):签名与验签(附源码分析)

本节介绍SPHINCS+ 算法的密钥生成、签名与验签。nnn:安全参数;www:Winternitz参数,WOTS+签名分解的基底;hhh:超树的高度;ddd:超树中子树的层数;kkk:FORS 树的数量;ttt:FORS 树的叶子节点数。

听雨草堂 4680

数学建模学习(121):Python实现模糊AHP(Fuzzy AHP)——从原理到实践

Python实现模糊AHP(Fuzzy AHP)

全栈川川 1540

《深度探索C++对象模型》阅读笔记(完整版)

《深度探索C++对象模型》完整阅读笔记

2401_82413779的博客 1903

多图详解VSCode搭建Python开发环境

本文通过多图的方式详细介绍了VSCode搭建Python开发环境,希望能对学习Python的同学们有所帮助。 文章目录 1. VSCode的介绍和安装 2. 安装插件 2.1 安装中文插件 2.2 安装Python插件 2.3 安装远程插件 3. 远程连接服务器 3.1 配置ssh 3.2 运行代码 3.3 调试代码

weixin_43178406的博客 8万+

C++对象内存模型布局详解

C++封装带来的布局成本多大?由空类组成的继承层次中,每个类对象的大小是多大?在C++中有两种数据成员(class data members):static 和 nonstatic,以及三种类成员函数(class member function):static、nonstatic 和 virtual。

songbijian的博客 1659

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

[C++] 内存布局完整解读

右值引用和移动语义:虽然这些特性主要影响临时对象的处理和函数参数的传递,但它们也可能间接影响内存布局,因为它们允许更高效的资源转移和避免不必要的复制。总之,C++11在内存布局方面提供了更多的控制和标准化,使得开发者能够更精确地管理数据结构在内存中的排列,同时也提高了代码的可移植性和性能。继承和多重继承:在多重继承中,基类的数据成员会先于派生类的数据成员排列,且每个基类的数据成员会按照它们在基类中的顺序排列。统一的内存对齐模型:C++11提供了跨编译器和平台的一致内存对齐模型,这有助于提高代码的可移植性。

wangdsh的博客 3463

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

深度解读《深度探索C++对象模型》之C++对象的内存布局(一)

C++语言相比C语言最重要的功能就是支持面向对象编程,为了实现面向对象编程,C++增加了类的封装和多态、继承等特性,那么这些特性的加入是否会造成对象的内存成本增加?如果增加了,那么到底增加了多少?

iShare_Carlos的博客 1735

假人有限元模型

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

深度探索C++对象模型

c++对象模型语言中直接支持面向对象程序设计的部分对于各种支持的底层实现机制说白了是介绍编译器是如何支持、实现C++的面向对象机制的。如,继承、虚函数、指向class members的指针等等,编译器是如何实现的。本书C++语法基于C++95本书出版自2001年,虽然书中用到的标准早已盖棺定论,cfront编译器也早已过时,当时来看一些无法确定的标准、难以实现的技术、功能也早已实现,但是对C++对象模型的某些实现方式依然沿用至今。这本书依然不过时。

surfaceyan的博客 1825

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

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

慢慢记录,慢慢更新。 605

C++对象的内存布局

本文介绍一个C++ struct/class在内存中的布局是什么样的,包括数据成员和方法成员,静态成员,非静态成员,虚拟成员在内存中的位置;本文不涉及(多)继承情况下对象内存布局的细节。

giantpoplar的专栏 4172

图说C++对象模型:对象内存布局详解

0.前言 文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局、虚表指针、虚基类指针等有深入了解的朋友可以慢慢看。 本文的结论都在VS2013上得到验证。不同的编译器在内存布局的细节上可能有所不同。 文章如果有解释不清、解释不通或疏漏的地方,恳请指出。 1.何为C++对象模型? 引用《深度探索C++对象模型》这本书中的话: 有两个概念可以解释C++对象模型: 语言中直接支持面向对象程...

weixin_34272308的博客 1456

深度解读《深度探索C++对象模型》之C++对象的内存布局(二)

C++语言相比C语言最重要的功能就是支持面向对象编程,为了实现面向对象编程,C++增加了类的封装和多态、继承等特性,那么这些特性的加入是否会造成对象的内存成本增加?如果增加了,那么到底增加了多少?

iShare_Carlos的博客 1489

C++对象模型笔记:对象的三种内存布局

下面的C++代码定义了一个类Point:class Point{public: Point(float xval); virtual ~Point(); float x() const; static int PointCount();protected: virtual ostream& print( ostr

jiangnanyouzi的专栏 2474

C++对象模型下数据成员存取效率深度剖析:从内存布局到性能优化

在C++编程中,数据成员的内存布局和存取效率是影响程序性能的关键因素。理解其底层原理,有助于开发者编写出更高效的代码。数据成员的存取成本主要取决于其内存偏移量的计算复杂度,这由类的继承体系决定。在单继承中,偏移量通常在编译期确定,存取效率很高;而在多重继承和虚继承中,由于需要运行时计算偏移量或调整指针,会引入额外的间接访问开销,可能降低缓存命中率并增加指令数。从技术价值看,优化数据存取能显著提升CPU缓存利用率,减少内存停顿周期,这对于高频交易系统、游戏引擎、科学计算等性能敏感场景至关重要。通过合理设计类层

weixin_30699915的博客 272

C++对象模型(五):The Semantics of Data Data语义学

本文是《Inside the C++ Object Model》第三章的读书笔记。主要讨论C++ data member的内存布局。这里的data member 包含了class有虚函数时的vptr和vtable的布局情况。

anzhsoft的技术专栏 9510

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

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

qq_40223389的博客 253
上一篇: C++对象模型(3)-- 类对象所占用的空间
下一篇: C++对象模型(5)-- 数据语义学:继承的对象布局(不含虚函数)
老蔡编程
博客等级 码龄23年 48粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值