C++类对象占用空间大小计算

【C++】类与对象——如何计算类对象的大小 文章目录前言第一步类对象里存储什么假设一一个对象里存储了所有的成员变量和方法假设二一个对象里存储了所有的成员变量和一个指向成员函数的数组指针假设三一个类对象里只存储了成员变量实际结果结论 前言 如果有小伙伴不太了解类的“形象”,可以参照这篇文章 什么是类?定义?访问?作用域? 本篇文章是介绍类对象的大小,与结构体大小计算非常相似,如果对结构体大小计算不清楚话,要提前学习哦 结构体大小怎么计算?内存对齐?偏移量? 第一步 类对象里存储什么 ????我们想要计算类对象的大小,就要先清楚类对象里存储的是什么 我们 阅读详情

0x1、知识点

1、一个类对象所占据的内存空间由它的数据成员(非静态成员)所占据的数据空间总和决定(需要考虑对齐);

2、类的成员函数(包括静态、非静态)、虚函数本身不占据对象的内存空间; 

3、空类、单一继承的空类、多继承的空类所占用空间大小为 1 ;

1.1、基本数据类型大小:

基本数据类型
bool1个字节
char1个字节
short2个字节
int4个字节
long4个字节
float4个字节
double8个字节

0x2、详细介绍

2.1、普通类,无继承

        先看代码:

class A {
public:
	A() {
	}
private:
	int a;
	int b;
	char c;
	int d;
	char e[1];
};
int main()
{
	A a;
	size_t aa = sizeof(a);
	printf("aa = %d\n", aa);
    return 0;
}
上述代码类A中有五个私有成员变量,按照内存大小对齐来计算:
int a --> 4字节
int b --> 4字节
char c --> 4字节
int d --> 4字节
char e --> 4字节
大小总计:20 字节

可能有人会有这个疑问:这个对齐是按照什么对齐的呢?答案就是按照成员变量中类型大小最大的来计算,即如果是int那么按照 4 字节对齐,如果是double类型的变量则是按照 8 字节对齐。而且需要注意的是,不要以为只有单字节的char在最后,且后面没有了其他数据成员就不用对齐了,依然是要对齐的!

上面的计算是否很简单?现在我们再来看成员变量中有double类型的类大小如何计算:

class A {
public:
	A() {
	}
private:
	int a;
	int b;
	char c;
	double d;
	char e[1];
 	int f;
 	char g;
 	int h;
};
int main()
{
	A a;
	size_t aa = sizeof(a);
	printf("aa = %d\n", aa);
    return 0;
}

上述代码类A中有八个私有成员变量,按照内存大小对齐来计算:

int a --> 4个字节
int b --> 4个字节
char c --> 8个字节
double d --> 8个字节
char e --> 4个字节
int f --> 4个字节
char g --> 4个字节
int h --> 4个字节
大小总计:40 字节
大家看到,同样是 char 类型的数据,凭什么 "char c"就是占 8 个字节,而 "char e" 和 "char g" 就只占 4 个字节? 这是为什么呢?如之前所说的,对齐值是按照最大的数据类型大小来算的,至于为什么 "char c" 是8个字节而 "char e" 和 "char g" 是4字节的原因是因为 "char e" 4 字节对齐后加上 "int f" 4个字节后刚刚凑够 8 个字节了,他们俩搭伙凑够 8 字节也正符合当前 8 字节对齐的规律。而 "char c" 很孤单,没人和它搭伙,所以就自己凑出 8 字节咯!

2.2、普通类,有继承

        如果只是单纯的普通类,且没有虚函数和虚继承的话,那么子类会继承父类所有成员。但是虽然继承了,如果父类中的成员是私有的话是无法被访问的。所以在这种情况下的继承,子类的大小就是父类的大小 + 子类成员大小,而且子类中同样也继承了父类中的对齐规则,8 字节对齐的依然还是 8 字节对齐。

class A {
public:
	A() {
	}
private:
	int a;
	int b;
	char c;
	double d;
	char e[1];
  	int f;
};

class B :public A {
private:
	char a;
	int b;
};

int main()
{
	A a;
	size_t aa = sizeof(a);
	B b;
	size_t bb = sizeof(b);
	printf("aa = %d\nbb = %d\n", aa, bb);
    return 0;
父类 A 的大小:
int a --> 4 字节
int b --> 4 字节
char c --> 8 字节
double d --> 8 字节
char e --> 4 字节
int f --> 4 字节
大小总计:32 字节

子类 B 的大小:

char a --> 4 字节
int  b --> 4 字节
父类 A --> 32 字节
大小总计:40 字节

2.3、有虚函数的类,有继承

        有虚函数的类,除了自身所有成员变量的大小外,还要加上由于有虚函数而被编译器生成的虚函数表指针,这个指针的大小同样受最大类型对齐影响,而且这个虚函数表指针的大小是在所有成员大小计算完后加上的,所以如果是最大类型为 int 的,则是所有成员大小之和之上再加 4 。同理,如果最大类型是double,则是加 8 。
class A {
public:
	A() {
	}
	virtual void fun() {}
private:
	int a;
	int b;
	char c;
	double d;
	char e[1];
  	int f;
};

class B :public A {
public:
	virtual void fun1() {}
private:
	char g;
	int h;
};
int main()
{
	A a;
	size_t aa = sizeof(a);
	B b;
	size_t bb = sizeof(b);
	printf("aa = %d\nbb = %d\n", aa, bb);
    return 0;
}

父类 A 的大小:

int a --> 4 字节
int b --> 4 字节
char c --> 8 字节
double d --> 8 字节
char e --> 4 字节
int f --> 4 字节
虚函数表指针大小 --> 8 字节
大小总计:40 字节

子类 B 的大小:

char g --> 4 字节
int h --> 4 字节
父类 A 的大小 --> 40 字节
大小总计: 48 字节

需要注意的是:虽然子类也有自己的虚函数,但是它继承了父类的虚函数表指针,也等于继承了父类的虚函数表。除非父类中没有虚函数,那么子类是不会自己再生成一个虚函数表的。它自己的虚函数地址会加入到从父类继承过来的虚函数表中。

0x3、最后

        还有关于虚继承的内容之后再添加上,关于《C++类对象占用空间大小计算》到此就结束了。本人才疏学浅,文中内容虽经过VS2015编译测试,但也可能难免疏忽出错,如果看官发现了错误还请及时留言指正!谢谢!

        如果您觉得这篇文章对您有所帮助,还请给个点赞鼓励!谢谢!





C++类所占内存大小计算 C++类所占内存大小计算 转载时请注明出处和作者联系方式 文章出处:http://blog.youkuaiyun.com/chenchong08 作者联系方式:vision_chen@yeah.net 说明:笔者的操作系统是32位的。 class A {}; sizeof( A ) = ? sizeof( A ) = 1 明明是空类,为什么编译器说它是1呢? 空类同样可以实例化,每个实例在 阅读详情

相关推荐

C++笔记之sizeof()判断对象所占内存空间的大小以及字符数组的长度

【代码】C++笔记之sizeof()判断对象所占内存空间的大小以及字符数组的长度。

小勇博客 538

C++对象内存分配总结

目录 六条基本规则 C++程序占用内存分类 实例代码: 参考: 六条基本规则 空类的大小为1。这个容易理解,任何东西都不可能凭空出现。 静态成员函数不占对象空间。这个很容易理解,因为类中的static是存储在数据区中的,不会占用对象的空间。 析构函数和构造函数不占用对象空间(构造和析构函数除外)。这个容易理解,因为当我们定义了空类的时候,就已经默认包含析构函数和构造函数。在下面的例子当中,我们自己定义了显示的析构函数和构造函数,观察输出。 成员函数不占对象空间。存放在代码区。 虚函数占用

沉迷单车的追风少年 1376

<C++>类的对象内存空间分配一点就通,this指针一学就会

🎉所有的道别里,我最喜欢“明天见” 🎉前言 this 指针在C++类和对象中是个很方便实用的关键字,可以简化对象成员属性的调用,使代码表达的含义更加准确;在之前的学习中我们都可以判断变量所占内存空间大小,那么我们创建的类对象所占的内存空间怎么计算呢?想知道this的妙用和类对象占用的内存空间就来跟我学习吧 🎉目录 成员属性和函数的存储 空对象 成员属性的存储 成员函数的存储 this指针的概念 解决名称冲突 返回对象指针*this 🎉总结 成员属性和函数的存储 在C++中成员变量和

叶落秋白的博客 1903

C++ 类对象的内存空间大小浅析

一个空的类的内存空间大小 #include "stdafx.h" #include <iostream> #include <vector> #include <algorithm> #include <map> using namespace std; class Base { public: }; int _tmain(int argc, _TCHAR* argv[]) { Base b; int size = sizeof(b); cout.

Christo的博客 1365

R语言分类变量的统计描述

三篇介绍了连续变量的统计描述的R语言相关函数,计算数值的相关统计指标。本文介绍分类变量的统计描述及如何在R语言中实现。 不同于连续变量,分类变量的统计描述主要是汇总分类变量各类别例数及百分比。 1、table()函数 ...

zsc943290710的博客 1万+

从零搭建芯片设计环境:在Cadence虚拟机中集成QRC进行寄生参数提取

本文详细介绍了在Cadence虚拟机中集成QRC工具进行芯片设计中的寄生参数提取的全流程。从环境准备、QRC安装配置到实际提取操作,提供了完整的步骤指南和常见问题解决方案,帮助工程师高效搭建芯片设计环境并优化提取性能。

weixin_30379531的博客 618

【C++】C++ 类的内存空间大小

如果定义对空的类或者结构体取sizeof()的值为0,那么该空的类或结构体实例化出很多实例时,在内存地址上就不能区分该类实例化出的实例。所以,为了实现每个实例在内存中都有一个独一无二的地址,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址,所以空类所占的内存大小是1个字节。通俗一点讲 就是 用空类实例化一个对象,这个对象的实体要存在内存中,既然要存在内存中那么就需要有个地址能访问他,为了避免多个实例对象的地址 问题,所以才有了者一个字节的空间。

qq_62917398的博客 390

智能车图像处理12-进阶篇4--环岛辅助判断条件

主函数: 第6行: 含义是当前需要不在坡道和车库状态 第11-12行 : 寻找一下环岛的双断点(在辅助函数中) 第16-66行: 当左右线的方差满足一边很大,一边很小时,truepianfangflag /truepianfangflagforleft 置1,在环岛的判断中使用。 辅助函数: 双断点函数(左与右相似,以做为例): 第13-28行: 第一处断点 第29-40行: 第一处断点后 连续边线 第41-52行: 第一处连续后,第二处断点 第53-64行: 第二处断点后,第二处

taiyuezyh的博客 1万+

C++中类对象所占空间的大小

首先,平时所声明的类只是一种类型定义,它本身是没有大小可言的。 因此,如果用sizeof运算符对一个类型名操作,那得到的是具有该类型实体的大小。 计算一个类对象的大小时的规律: 空类、单一继承的空类、多重继承的空类所占空间大小为:1(字节,下同);一个类中,虚函数本身、成员函数(包括静态与非静态)和静态数据成员都是不占用类对象的存储空间的;因此一个对象的大小≥所有非静态成员大小的总

北方的雪之博客专栏 1039

RK3588开发笔记-MIPI-CSI接口视频解码芯片XS9922B调试

Rockchip RK3588 是一款高性能的处理器,支持多种摄像头接口,包括 MIPI(Mobile Industry Processor Interface)接口。MIPI是一种用于移动设备和嵌入式系统中的摄像头、显示器和其他传感器设备的串行接口标准。MIPI是MIPI联盟发起的为移动应用处理器制定的开放标准。CSI-2(Camera Serial Interface 2)是MIPI 联盟定义的另一种高速接口,主要用于摄像模组和处理器之间的连接。

flypig has a dream! 6860

OsgEarth —— 笔记1 - 创建地球的earth文件

效果         正文      1、准备一张全球的渲染图(tif格式)、一张全球的高程图(tif格式)        2、创建并编写.earth文件           在步骤1目录下创建china-simple.earth,并将如下内容写入。 <map name="Globe" type="geocentric" version="2"> <!-- 全球影像图 --> <image name="GlobeImage" driver="gdal"> &l

7681

C++中类对象的内存布局和占用空间

C++中类对象的内存布局和占用空间

never give up的博客 494

Electron vue3 - 使用SerialPort与串口交互教程,计算机串行端口(COM口、USB转串口等)进行通信连接读取或写入Arduino、单片机、PLC、扫码枪、打印机、老式调制解调器!

实战Electron使用SerialPort与串口交互详细全过程,Electron-vue3与串口交互示例,Electron vue使用serialport实现串口交互通讯,Electron-vue使用serialport连接本地串口,electron-vue 台称串口对接 SerialPort,electron串口调试工具,electron+vue+serialport实现串口通信,串口通信serialport使用和调试,electron-vue使用serialport串口通信及踩过的坑(已解决!)ele

🏆 前端领域优质创作者 4640

C++ 中结构体大小的计算方式

前言: 说起来C++还真是一门神奇的语言,就像你的GirlFriend一样晦涩难懂,你永远不知道下一秒她的心情会是什么样的,不过好在C++它终究还是一门编程语言,工具毕竟是死的,既然是死的那就好办了,总有方法来对付它。当你点进这篇文章或许是正带着疑惑而来的,或者曾碰到过结构体的大小飘忽不定不知道怎么计算,又或许你还没有遇到过这样的问题,不过也没关系所谓未雨绸缪也不是一件坏事,今天就来给大家讲一下C...

尼克不可的博客 5726

Codex入门19-数据库操作(解放双手:用自然语言写SQL、建表和数据迁移)

写 SQL 是后端开发的日常,但复杂的 JOIN、子查询、窗口函数总让人头疼。本文教你用 Codex CLI 实现:自然语言直接生成 CREATE TABLE、复杂 SQL 查询、数据库迁移脚本(Prisma/Knex/Alembic)、ORM 模型代码(SQLAlchemy/TypeORM)、甚至自动生成数据库文档。重点强调安全红线——永远不要让 AI 直接连接生产数据库。从需求描述到完整数据库层代码,一篇搞定。

yueyeguzhuo的专栏 234

康耐视visionpro-CogCreateSegmentAvgSegsTool操作工具详细说明

康耐视visionpro-CogCreateSegmentAvgSegsTool操作工具详细说明

视觉人机器视觉的博客 1480

C++中关于类对象所占内存大小的计算

一句话权威总结如下: 一个类对象需要占用多大的内存空间: 非静态成员变量总和加上编译器为了CPU计算作出的数据对齐处理和支持虚函数所产生的负担的总和。

JunJie的个人博客 2218

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C++类的占用空间

面(笔)试的时候经常碰到求C++类的占用空间的问题,尤其是包含了虚函数的单一继承和多重继承时类的占用空间,这里作一下简单的测试和说明。 一、空类的占用空间     空类的占用空间为1个字节,《深度探索C++对象模型》是这样说的:“那是被编译器插进去的一个char ,使得这个class的不同实体(object)在内存中配置独一无二的地址”,也就是说空类的这个char是用来标识类的不同对象

么幺 1015

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

类对象的存储模型 | 结构体内存对齐 | 如何计算类对象大小 | 空类占多少字节

对象的大小如何计算,空类的大小是为0个字节吗?

qq_63159859的博客 921

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

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

C# 获取文件占用空间 (绝对准确)

首先说下文件夹/文件大小与占用空间的区别: 这与是硬盘分区格式有关。 大小是文件的实际大小,而占用空间是占硬盘的实际空间,以FAT32格式为例,硬盘的基本存储单位是簇,在FAT32中一簇是4KB 那么,也就是说即使文件只有1个字节,在硬盘上也要占到4KB的空间 如果文件是4KB零1个字节,那就要占用8KB的空间,以此类推 结论: 大小是文件的实际大小,而占用空间是占硬盘的实际空间。如图(我这里一簇是4kB) 计算思路 所以,要想获得占用空间,就需要先获得文件的大小,然后就可以通过把簇补全即可算出文件的占用

weixin_44927769的博客 4919

C++ --- 类对象大小的计算

对象中没办法存储,这些指令存储在一个单独的区域(代码段),那么对象中非要存储的话,只能是成员函数的指针。Person 类实例化p1,p2两个对象,p1,p1都有各自的成员变量_age/_name/存储各自的数据,但是p1,p2的成员函数Init ()/Print() 指针却是一样的 ,存储在对象中就浪费了,因为如果Person类实例化了100个对象,那么成员函数指针就重复存储100次,太浪费了。• 如果嵌套了结构体的情况,嵌套的结构体对⻬到⾃⼰的最⼤对⻬数的整数倍处,结构体的整体⼤⼩。

2303_79004636的博客 669

C++中类对象所占用的内存空间

本文主要介绍C++中类对象的内存分布。

TechNomad的博客 782

【C++】类大小的计算

1 初识 测试环境: 操作系统:Windows 10 编译器:g++.exe (x86_64-posix-sjlj-rev0, Built by MinGW-W64 project) 8.1.0 本机环境测试时,指针大小为 8 字节,请读者根据实际情况自行判断。 1.1 内存对齐 可以使用 sizeof 或者 alignof 判断基本类型的对齐大小。但面对自定义类型的时候,前者就不行了,而后者...

zzy0006的博客 574

类和对象——类的对象占用内存的大小计算

类的对象的内存占用计算方式

m0_73693552的博客 1389

《C++中类对象的内存布局和占用空间》《C++ 类里面,函数占用存储空间问题 》

《C++中类对象的内存布局和占用空间》  一个类的实例化对象所占空间的大小? 注意不要说类的大小,是类的对象的大小. 首先,类的大小是什么?确切的说,类只是一个类型定义,它是没有大小可言的。 用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小。 很多C++书籍中都介绍过,一个Class对象需要占用多大的内存空间。最权威的结论是: *非静态成员变量总合。

michaelhan3的博客 670
上一篇: 手工实现简易PE文件
下一篇: ElementUI级联框回显问题
UntilTheCore
博客等级 码龄9年 3粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值