Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C++:42---类的内存大小

C++:42---类的内存大小

作者头像
用户3479834
发布于 2021-02-03 06:50:08
发布于 2021-02-03 06:50:08
74100
代码可运行
举报
文章被收录于专栏:游戏开发司机游戏开发司机
运行总次数:0
代码可运行

一、类内存的特点

  • 类内无任何成员变量时,默认为1字节
  • 类内成员遵循内存的对齐补齐规则(与结构体的对齐补齐一样)
  • 函数不占内存(存在代码段)
  • 有继承关系时,父类的成员变量也属于类内寸的一部分,但是C++标准并没有明确规定派生类的对象在内存中如何分布(也就是说基类部分和派生类的成员不一定是连续存储的)

二、继承中内存的关系

  • ①继承之后,子类中开辟了新的内存空间存储了基类的数据成员(不论公有私有或保护)
  • ②但子类没有存储父类的方法(函数等),而是直接使用(因为成员方法存在代码段,可直接使用)
代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class A
{
public:
int a;
};
class B:public A//继承于A
{
public:
int b;
};

三、演示案例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class A{};
int main(){
cout<<sizeof(A);
return 0;

}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class A
{
int a;
char b;
char c;
int d;
};
cout<<sizeof(A); //12
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class B
{
int a;
};
class A:public B
{
int a;
char b;
char c;
int d;
};
cout<<sizeof(A); //16
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 游戏开发司机 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
结合实例深入理解C++对象的内存布局
因为二进制使用了不同版本的 proto 对象,对象的内存布局不一致导致读、写成员的内存地址错乱,进而导致进程 crash 掉。这之中会出现下面的问题:
腾讯技术工程官方号
2024/08/08
7831
结合实例深入理解C++对象的内存布局
C++:深入理解多态
1、举个例子比如说购买高铁票这个行为,如果是普通人就是原价购买,如果是学生的话就是半价购买,如果是军人的话,可以优先走绿色通道购买……
小陈在拼命
2024/05/26
1490
C++:深入理解多态
【C++】多态——实现、重写、抽象类、多态原理
多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。
平凡的人1
2023/10/15
6590
【C++】多态——实现、重写、抽象类、多态原理
C++类大小的计算
可以看到,类实例化的对象的大小为1。这是因为即使类是空白类,编译器也会分配一个字节的空间来占位,用来和真正的空白/空变量区别开来(毕竟实例化其实就是分配一定的内存空间,如果没有分配空间,那么就和没有实例化差不多了)。不过注意的是,如果空白类作为基类被继承了的话,是不会对继承它的类的空间产生影响的,即在继承的一瞬间,基类大小变为0,而继承它的类的大小只与自己的成员变量有关(此处默认为单一继承):
太阳影的社区
2021/10/15
1.2K0
复杂的C++继承
继承这个词对我们来说应该不陌生,在现实生活中,你作为你父亲的继承者之一可以获得你父亲的财产,直接少奋斗N年。这里的继承也差不多是这个意思:在一个程序中有很多不同的类,但是这些类可能有共同的属性(成员变量或成员方法),为了避免多次对同样的成员方法和成员变量声明,C++就提出了继承。继承是类设计层次的代码复用。被继承的类就是父类或者基类,继承的类叫做子类或者派生类。
始终学不会
2023/10/17
3450
复杂的C++继承
【C++】多态
1. 多态是在继承的基础之上实现的,我们说继承是类设计层次的代码复用的一种手段,而多态则是在此基础上实现的多种形态,完成某一件事,可以由于对象的不同产生不同的完成结果,我们称这种现象为多态。
举杯邀明月
2023/04/12
6100
【C++】多态
【C++】继承
1. 继承是面向对象语言进行代码复用的一种手段,以前我们所接触的代码复用都是函数复用,譬如模拟实现vector的时候,尾插尾删都是复用了insert和erase接口。而继承提供的是一种类设计层次的代码复用,在原有类中增加扩展并实现新的功能,这样所产生的类叫做派生类或子类,原有类被称为基类或父类。
举杯邀明月
2023/04/12
7920
【C++】继承
今天你学C++了吗?——C++中的多态
具体来说,运行时多态允许我们在完成某个行为(函数)时,传入不同的对象就会完成不同的行为,从而达到多种形态。假设我们正在开发一个图形绘制应用程序,该程序需要支持多种图形对象(如圆形、矩形和三角形)的绘制。我们可以设计一个基类Shape,并在其中定义一个虚函数draw()用于绘制图形。不同的图形对象(圆形、矩形和三角形)将作为Shape的派生类,并在这些派生类中重写draw()函数以实现各自的绘制逻辑。同样地,在动物叫声的模拟中,传入猫对象时发出“喵”的叫声,传入狗对象时发出“汪汪”的叫声,这也是通过多态性来实现的。
用户11352420
2025/03/16
2640
今天你学C++了吗?——C++中的多态
【C++】你不得不爱的——继承
 凡是面向对象的语言,都有三大特性,继承,封装和多态,但并不是只有这三个特性,是因为者三个特性是最重要的特性,那今天我们一起来看继承!
The sky
2023/04/12
4240
【C++】你不得不爱的——继承
精选 30 个 C++ 面试题(含解析)
malloc和free都是C/C++语言的标准库函数,new/delete是C++的运算符。
肉眼品世界
2022/03/29
3.4K0
【C++】看不懂多态?这篇文章带你吃透它!
​ 该内容中的代码以及解释都是在 vs2022 下的 x86 环境中,涉及的指针都是 4 个字节,如果要在其他的平台下运行,部分代码需要改动。
利刃大大
2025/02/03
1150
【C++】看不懂多态?这篇文章带你吃透它!
c++头脑风暴-多态、虚继承、多重继承内存布局
gdb怎么用这里就不展开了,默认你会使用gdb,使用gdb设置打印格式,然后看对象people的内存布局及大小,如下:
cpp加油站
2021/06/29
7880
C++中的继承
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。
二肥是只大懒蓝猫
2023/03/30
1.1K0
C++中的继承
C++ 虚拟继承
1.为什么要引入虚拟继承 虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继 承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类。实现的代码如 下: class A class B1:public virtual A; class B2:public virtual A; class D:public B1,public B2; 虚拟继承在一般的应用中很少用到,所以也往
猿人谷
2018/01/17
2.5K0
C++ 虚拟继承
C++:05---class和struct
C++被称为“C with class”,可见在C++中class是多么重要,与class类似的一个结构就是struct了,struct最早是在C语言中出现的,在C++中对struct的功能也进行了扩展。
用户3479834
2021/02/03
8800
【C++修炼之路】15.C++继承
如果你正处在学校,那么一定会接触到学生、老师、食堂阿姨、保安大叔……如果将其都转化成计算机语言,那么每一类人都属于一个类:
每天都要进步呀
2023/03/28
5950
【C++修炼之路】15.C++继承
C++ 多态
多态性是面向对象编程中的一个核心概念,它允许对象通过统一的接口表现出不同的行为。多态性增强了程序的灵活性和可扩展性。
2025/01/21
1620
C++ 多态
C++类间的 “接力棒“ 传递:继承(上)
共同点就相当于一个基底,称他为基类或者父类,在基类的基础上拓展出来的各种各样的角色称他为派生类或者子类,这样一个拓展的过程就叫继承,所以继承的本质是一种复用
DARLING Zero two
2025/04/04
1150
C++类间的 “接力棒“ 传递:继承(上)
c++类和继承面试点25连问
c++的三大特性,说白了其实就是面向对象的三大特性,是指:封装、继承、多态,简单说明如下:
cpp加油站
2021/06/29
1.1K0
浅析C++类的内存布局
之前Jungle写过一篇文章《探究C++:虚函数表究竟怎么回事?》,主要通过测试代码来验证虚函数表的存在,进而说明C++的多态机制。但完成文章后仍旧觉得文章云里雾里,并不能很好地说明C++类的内存布局。于是在阅读完3遍《深度探索C++对象模型》之后,重新整理了相关知识点,完成此文。
用户6557940
2022/07/24
6190
浅析C++类的内存布局
相关推荐
结合实例深入理解C++对象的内存布局
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验