当前位置: 首页 > news >正文

CPP-类对象大小的组成


要计算一个类对象的大小要先明白一个问题:类中既可以有成员变量,又可以有成员函数,那么一个类的对象中包含了什么?


下面来看一段代码:

// 类中既有成员变量,又有成员函数
class A1 {
public:void f1() {}
private:int _a;
};
// 类中仅有成员函数
class A2 {
public:void f2() {}
};
// 类中仅有成员变量
class A3
{
public:int _a;
};
int main()
{cout << sizeof(A1) << endl;// 4cout << sizeof(A2) << endl;// 1cout << sizeof(A3) << endl;// 4
}

通过代码演示实际上我们可以发现类中的成员函数不影响类的大小。实际上由于同一个类的每个对象中只有变量不一样,而函数代码都是一样的,所以没有必要每个对象都存一份函数代码。代码只保存一份,在对象中保存存放代码的地址。

结论:一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐。

结构体内存对齐规则:
1. 第一个成员在与结构体偏移量为0的地址处。
2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
VS中默认的对齐数为8
3. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

相关文章:

  • Pip换源秘籍:让你的Python包飞行起来!
  • 美团携手HarmonyOS SDK,开启便捷生活新篇章
  • 佳能打印机问题解决
  • 发表在SIGMOD 2024上的高维向量检索/向量数据库/ANNS相关论文
  • LabVIEW火箭发动机试车台程序
  • Android13 WMS窗口层级树
  • 第一章 - 第11节- 因特网概述 - 课后习题
  • MySQL进阶——触发器
  • 【2024德国签证】资金证明详解|从线上开户到签证申请超详细指南!
  • 一天了解23种设计模式
  • k8s容器启动不了,一直重启, 报红提示Not Ready
  • 网络安全,怎么搭建Python防范环境
  • 小白跟做江科大32单片机之定时器
  • opencascade AIS_InteractiveContext源码学习5 immediate mode rendering 即时模式渲染
  • docker镜像基本操作
  • 收藏网友的 源程序下载网
  • Hibernate【inverse和cascade属性】知识要点
  • java8-模拟hadoop
  • PHP CLI应用的调试原理
  • React组件设计模式(一)
  • sessionStorage和localStorage
  • vue学习系列(二)vue-cli
  • windows下使用nginx调试简介
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 关于Java中分层中遇到的一些问题
  • 简单易用的leetcode开发测试工具(npm)
  • 今年的LC3大会没了?
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 蓝海存储开关机注意事项总结
  • 设计模式(12)迭代器模式(讲解+应用)
  • 使用common-codec进行md5加密
  • 小李飞刀:SQL题目刷起来!
  • 学习HTTP相关知识笔记
  • 交换综合实验一
  • ## 基础知识
  • $().each和$.each的区别
  • (1)Hilt的基本概念和使用
  • (20050108)又读《平凡的世界》
  • (C#)一个最简单的链表类
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (ZT)一个美国文科博士的YardLife
  • (二)linux使用docker容器运行mysql
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (循环依赖问题)学习spring的第九天
  • (原)Matlab的svmtrain和svmclassify
  • (原創) 物件導向與老子思想 (OO)
  • (转)memcache、redis缓存
  • .gitignore
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .Net 中Partitioner static与dynamic的性能对比
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • :O)修改linux硬件时间
  • @ModelAttribute使用详解