C++:类对象的存储方式

server/2025/3/18 18:21:34/

如何计算类对象的大小

class A
{
public:
void PrintA()
{
cout<<_a<<endl;
}
private:
char _a;
};

  类中既可以有成员变量,又可以有成员函数,那么一个类的对象中包含了什么?如何计算
一个类的大小?

类对象的存储方式猜测

  • 对象中包含类的各个成员

  缺陷:每个对象中成员变量是不同的,但是调用同一份函数,如果按照此种方式存储,当一
个类创建多个对象时,每个对象中都会保存一份代码,相同代码保存多次,浪费空间。那么
如何解决呢?

  • 代码只保存一份,在对象中保存存放代码的地址

  • 只保存成员变量,成员函数存放在公共的代码段

对于上述三种存储方式,那计算机到底是按照那种方式来存储的?

我们再通过对下面的不同对象分别获取大小来分析看下:

#include<iostream>
using namespace std;
class A1 {
public:void f1() {}
private:int _a;
};
// 类中仅有成员函数
class A2 {
public:void f2() {}
};
// 类中什么都没有---空类
class A3
{};
int main()
{A1 a1;A2 a2;A3 a3;cout << sizeof(a1) << endl;cout << sizeof(a2) << endl;cout << sizeof(a3) << endl;return 0;}

打印结果:


结论:一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐
注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。

结构体内存对齐规则

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

编译器按以上原则处理结构体:

struct Example {char a;      // 1字节int b;       // 4字节,需4字节对齐double c;    // 8字节,需8字节对齐
};

 实际内存布局(假设64位系统):

0-7:   [a][padding][b....]
8-15:  [c........]

总大小=16字节(而非1+4+8=13)

内存对齐的基本原理

  1. 数据总线特性:CPU通过固定位宽(如32位/64位)的总线访问内存。例如32位系统每次读取4字节,若数据跨越两个总线位宽单元,需要多次读取
  2. 硬件限制:某些架构(如ARMv5)直接禁止非对齐访问,触发总线错误
  3. 缓存优化:对齐数据更易填满完整的缓存行(通常64字节),减少缓存失效概率

  内存对齐通过空间换时间的策略,平衡了硬件特性和软件效率。理解这一机制有助于写出高性能、跨平台兼容的代码结构。

 


http://www.ppmy.cn/server/176019.html

相关文章

嵌入式/C++笔试面试指南(前言)

在数字化转型与智能硬件快速发展的时代&#xff0c;嵌入式系统与 C 语言作为支撑物联网、人工智能、工业控制等领域的核心技术&#xff0c;正面临着前所未有的人才需求。无论是初入职场的应届生&#xff0c;还是寻求技术突破的从业者&#xff0c;掌握嵌入式开发与 C 编程的核心…

谷粒商城:性能压测JVM堆区

目录 Kit Apache JMeter VisualVM 堆内存 jvm内存模型 垃圾回收&#xff08;Garbage Collection, GC&#xff09; 新对象分配内存 GC步骤 MinorGC 性能优化 影响因素 优化 nginx动静分离 优化三级分类获取 Jvm参数配置堆区 测试 Kit Apache JMeter 压力测试&…

如何处理PHP中的日期和时间问题

如何处理PHP中的日期和时间问题 在PHP开发中&#xff0c;日期和时间的处理是一个常见且重要的任务。无论是记录用户操作时间、生成时间戳&#xff0c;还是进行日期计算&#xff0c;PHP提供了丰富的函数和类来帮助开发者高效处理这些需求。本文将详细介绍如何在PHP中处理日期和…

关于deepseek R1模型分布式推理效率分析

1、引言 DeepSeek R1 采用了混合专家&#xff08;Mixture of Experts&#xff0c;MoE&#xff09;架构&#xff0c;包含多个专家子网络&#xff0c;并通过一个门控机制动态地激活最相关的专家来处理特定的任务 。DeepSeek R1 总共有 6710 亿个参数&#xff0c;但在每个前向传播…

每天一篇《目标检测》文献(三)

今天看的是《基于改进 YOLOv8 的被遮挡柑橘果实检测算法研究》。 目录 一、摘要 二、背景介绍 三、改进结构 四、空间定位算法 五、定位实验 一、摘要 为了获取柑橘果实的准确特征信息,实现被遮挡柑橘的准确识别和定位,达到精确采 摘的目的,提出了一种改进的被遮挡柑橘果…

TCP/IP 协议精讲-精华总结版本

序言 本文旨在介绍一下TCP/IP涉及得所有基础知识&#xff0c;为大家从宏观上俯瞰TCP/IP提供一个基石&#xff0c;文档属于《TCP/IP图解&#xff08;第五版&#xff09;》的精简版本。 专业术语 缩写 全称 WAN Wide area network广域网 LAN Local area network局域网 TC…

AI第一天 自我理解笔记--微调大模型

目录 1. 确定目标&#xff1a;明确任务和数据 2. 选择预训练模型 3. 数据预处理 (1) 数据清洗与格式化 (2) 划分数据集 (3) 数据加载与批处理 4. 构建微调模型架构 (1) 加载预训练模型 (2) 修改模型尾部&#xff08;适配任务&#xff09; (3) 冻结部分层&#xff08;可…

【从零开始学习计算机科学】软件工程(一)软件工程中的过程模型

【从零开始学习计算机科学】软件工程(一)软件工程中的过程模型 软件与软件工程软件工程具有以下核心要素软件工程中的过程模型惯用过程模型瀑布模型V模型增量过程模型演化过程模型原型模型螺旋模型协同开发模型喷泉模型专用过程模型构件组装模型统一过程模型(RUP)统一过程模…