C++中一个对象到底占用多少内存?

1.前言

这个问题对于开发可能不是那么的关注,但是其实在C++相关的题中却经常出现,下面将针对性的记录说明下这个问题

2.直蹦主题

2.1 重要结论

1)非静态成员函数的总和
2)考虑CPU的运算,不同大小的变量,会按最大类型以单位采取对齐策略,
3)当存在虚函数时建立虚函数表会增加额外的内存开销

2.2 测试说明

根据以上结论,下面进行测试,更容易理解:

// 无成员函数和成员变量,由于对象地址的独立性,也将占有1字节
class TestSize0
{};// 拥有成员函数: 成员函数们不占用内存,还是一字节
class  TestSize1
{public:TestSize1();~ TestSize1();void fun1() {};void fun2() {};
};// 拥有一个int成员变量: int占4字节
class  TestSize2
{public:TestSize2();~TestSize2();int i2;
};// 拥有一个int和一个char成员变量,将对齐 4 + 4 = 8
class  TestSize3
{public:TestSize3();~TestSize3();int i3;char c3;
};// 拥有一个int和两个个char成员变量,将对齐 4 + 4 = 8
class  TestSize4
{public:TestSize4();~TestSize4();int i4;char c4, c42; // 对齐后为4足以存下两个char
};// 含有虚函数将额外的增加内存(虚函数表),具体大小同编译器相关吧,我这个为8
class  TestSize5
{public:TestSize5();~TestSize5();virtual void fun() {};
};// 含有两个虚函数的,并不是加个虚函数就得加内存,还是输出8
class  TestSize6
{public:TestSize6();~TestSize6();virtual void fun1() {};virtual void fun2() {};
};// 这个呢? 3 * 8 = 24
class  TestSize7
{public:TestSize7();~TestSize7();void fun1() {};virtual void fun2() {}; // 8int i7;                  // 4→8(还剩下4没用)char c7[5];             // 5→8 (int多出来的4存不下,必须重新拿下个8)
};// 含有的静态成员不占用栈内存: 8 * 2 = 16
class  TestSize8
{public:TestSize8();~TestSize8();void fun1() {};virtual void fun2() {}; // 8static int i8;           // 静态不占用栈内存char c8[5];              // 5→8
};int main()
{cout << "无成员函数和成员变量的空类 TestSize0:" << sizeof(TestSize0) << endl;cout << "含有成员函数的类 TestSize1:" << sizeof(TestSize1) << endl;cout << "含有一个int成员变量的类 TestSize2:" << sizeof(TestSize2) << endl;cout << "含有一个int和char成员变量的类 TestSize3:" << sizeof(TestSize3) << endl;cout << "含有一个int和两个char成员变量类 TestSize4:" << sizeof(TestSize4) << endl;cout << "含有一个虚函数的类 TestSize5:" << sizeof(TestSize5) << endl;cout << "含有两个虚函数的类 TestSize6:" << sizeof(TestSize6) << endl;cout << "练习一下呢 TestSize7:" << sizeof(TestSize7) << endl;cout << "含有静态成员 TestSize8:" << sizeof(TestSize8) << endl;system("pause");return 0;
}

测试结果:

3.最后

以上就是针对这个问题的比较针对性的回答,其中还有些原理性,另外还有针对基类的相关问题没有阐述,下次再说吧,如有问题还请联系修正!

参考链接:
C++一个类的内存占用情况

meo学习笔记4:C++中对象占用内存情况相关推荐

  1. Java 中对象占用内存大小计算

    原文地址 mp.weixin.qq.com byte 与 bit bit:位,比特.信息的最小单位,二进制数中的一个位数 (二进制位),其值为"0" 或"1": ...

  2. C++学习笔记-第4单元-对象和类(基础)

    C++学习笔记 文章目录 C++学习笔记 第4单元 对象和类(基础) 单元导读 4.1 用类创建对象 4.1.1 对象和类 4.1.2 创建对象并访问 4.2 对象拷贝.分离声明与实现 4.2.1 对 ...

  3. JavaScript学习笔记02【基础——对象(Function、Array、Date、Math)】

    w3school 在线教程:https://www.w3school.com.cn JavaScript学习笔记01[基础--简介.基础语法.运算符.特殊语法.流程控制语句][day01] JavaS ...

  4. Hadoop学习笔记—11.MapReduce中的排序和分组

    Hadoop学习笔记-11.MapReduce中的排序和分组 一.写在之前的 1.1 回顾Map阶段四大步骤 首先,我们回顾一下在MapReduce中,排序和分组在哪里被执行: 从上图中可以清楚地看出 ...

  5. ASP.Net学习笔记015--ASP.Net中使用Cookie

    ASP.Net学习笔记015--ASP.Net中使用Cookie 表单数据欺骗: 原理跟收到欺骗短信一样,移动信号塔[基站],伪装的移动信号塔会屏蔽移动信号,并且 在信号范围内的手机会自动切换为接收伪 ...

  6. JavaScript学习笔记03【基础——对象(RegExp、Global)】

    w3school 在线教程:https://www.w3school.com.cn JavaScript学习笔记01[基础--简介.基础语法.运算符.特殊语法.流程控制语句][day01] JavaS ...

  7. python的messagebox的用法_Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解...

    本文实例讲述了Python GUI编程学习笔记之tkinter中messagebox.filedialog控件用法.分享给大家供大家参考,具体如下: 相关内容: messagebox 介绍 使用 fi ...

  8. Python学习笔记 (类与对象)

    Python学习笔记 (类与对象) 1.类与对象 面向对象编程语言类: 一个模板, (人类)-是一个抽象的, 没有实体的对象: (eg: 张三, 李四) 属性: (表示这类东西的特征, 眼睛, 嘴巴, ...

  9. [Unity学习笔记]2D游戏中的触碰/OnMouseDown

    [Unity学习笔记]2D游戏中的触碰/OnMouseDown 这种情况多用于2D游戏的触屏 1.给2D游戏对象加上collider 2D,让其能够被检测到

最新文章

  1. iframe父页面获取iframe子页面的元素 与 iframe子页面获取父页面元素
  2. java中 instanceof 的用法
  3. android 自动表单提交数据,Android 使用三种方式获取网页(通过Post,Get进行表单的提交)...
  4. mysql 记录更新 内部_MySQL 入门(1):查询和更新的内部实现
  5. c++ explicit构造函数[转]
  6. 基于学术研究风云卫星数据下载教程
  7. android app 嵌入广告,流氓来了!如何拯救手机中嵌入广告的应用
  8. [人工智能-深度学习-29]:卷积神经网络CNN - 全连接网络与卷积网络结构的互为等效与性能比较
  9. OPCClient远程连接OPC服务器配置手册
  10. keep-alive和activated
  11. layui table动态选中_NeurIPS 2020 | 伯克利新工作: 基于动态关系推理的多智能体轨迹预测问题...
  12. 简单粗暴理解与实现机器学习之K-近邻算法(三):距离度量、欧氏距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、标准化距离、余弦距离、汉明距离、杰卡德距离、马氏距离
  13. 台式机与笔记本电脑BIOS启动热键整理
  14. java如何实排班表时间算法_安卓自定义View-日历型排班表-CalendarScheduleView
  15. MATLAB中颜色模型介绍级各模型之间转换(RGB、HSV、NTSC、YCbCr、HSI)
  16. java内部类继承类_java内部类基础(内部类继承关系 或外部类整体继承)
  17. 设计师张超越_超越响应能力–手机网站设计技巧
  18. Windows mobile 客户解决方案成功案例
  19. ✔✔✔ TensorBoard 的正确打开方法(含错误解决方法,超详细) ✔✔✔
  20. Babylonjs入门02——VsCode+vue+babylonjs开发第一个babylon项目程序

热门文章

  1. 自编码神经网络相似图片检索
  2. C语言求x的y次方,fun函数实现x的y次方的计算,main函数中调用fun函数
  3. 一个很好用的Venn图在线编辑网站
  4. Win32无边框窗口
  5. 【Leetcode】1512. Number of Good Pairs
  6. Docer实现Django Uwsgi部署
  7. 单片机课程设计---篮球记分牌
  8. 转:听听别人怎么说:VueJS 与 ReactJS
  9. Python3读取h5,pkl,npz,npy格式的文件
  10. photoshop中的快速选择工具