类对象模型

  • 如何理解类与对象

类:

通俗理解,类相当于一个模型框架,限定了类有哪些成员变量,但从底层来看,内存并没有分配实际的物理空间来存储类

对象:

类对象即为类的具体描述,当类对象进行实例化过程中,内存将为其分配物理空间

一个类可以实例化多个对象,实例化出的对象  占用实际的物理空间,存储类成员变量

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

  • 类大小的计算

类中有成员变量,以及成员函数,成员函数不占据内存空间,所以在类计算的过程中仅需要计算成员变量即可

但有一点需要注意:一个空类的大小并不是我们所认为的0,这是为什么呢?

编译器在处理空类的时候,将空类的大小给定为1字节,通过给定1字节来标识空类

下列代码进行测试

// 类中既有成员变量,又有成员函数
class A1 {
public:    void f1(){}
private:    int _a;
};// 类中仅有成员函数
class A2 {
public:   void f2() {}
};// 类中什么都没有---空类
class A3 {};int main()
{int a = sizeof(A1);int b = sizeof(A2);int c = sizeof(A3);return 0;
}

对此,类对象大小的计算等同于计算类成员变量大小的计算

类比结构体计算过程中

结构体内存对齐规则 
1. 第一个成员在与结构体偏移量为0的地址处。即第一个成员变量不需要考虑对齐  从0地址开始存储即可

2. 其他成员变量要对齐到对齐数的整数倍的地址处。
注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值VS中默认的对齐数为8

3. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍

4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处结构体的整体大小就是 所有最大对齐数(含嵌套结构体的对齐数)的整数倍

下面通过代码来具体计算一下类大小

class A
{int a;char b;double c;int d;
};

分析:

int a;占4字节    对齐数为4

char b;占1字节   对齐数为1

double c;占8字节  对齐数为8

int d;占4字节    对齐数为4

根据对齐原则:

实际大小为20byte  最后总大小必须为最大对齐数8的整数倍   24byte

思考:

1. 结构体怎么对齐? 为什么要进行内存对齐

结构体对齐的目的就是为了计算机在内存读取更快速,计算机在内存中读取中一次读取8byte,取决于编译器默认对齐数

2. 如何让结构体按照指定的对齐参数进行对齐

#pragma  pack(所设置对齐数)

3. 如何知道结构体中某个成员相对于结构体起始位置的偏移量

强制类型转化为char*    取地址相减

4. 什么是大小端?如何测试某台机器是大端还是小端,有没有遇到过要考虑大小端的场景

大端:低地址存高位    高地址存低位    符合正常阅读序

小端:低地址存低位    高地址存高位    阅读逆序

大小端测试:

(1)指针法测试:

(2)联合体测试

对于类对象模型的理解(类大小计算+大小端字节序)相关推荐

  1. java 大小端字节序_理解大小端字节序

    学过编程的人都应该知道大小端字节序的概念,但是很多时候,总是把他们弄混,这是整理出来的一份很简单的方式理解字节序的文章,废话不多说,这里直接入正题. 什么是字节序? 字节序,简单来说,就是指的超过一个 ...

  2. 【转】理解字节序 大端字节序和小端字节序

    转自:https://www.cnblogs.com/gremount/p/8830707.html 以下内容参考了 http://www.ruanyifeng.com/blog/2016/11/by ...

  3. java 大端字节序_理解字节序 大端字节序和小端字节序

    以下内容参考了 http://www.ruanyifeng.com/blog/2016/11/byte-order.html https://blog.csdn.net/yishengzhiai005 ...

  4. Java字节序与大小端转换_什么时候要进行大小端字节序的转换? | 学步园

    什么时候要进行大小端字节序的转换? 通过socket收发数据(在intel的处理器上), 什么时候要进行大小端字节序的转换? 比如发一个int型的数据出去,要不要进行转换? 还是两端一样,就不用考虑转 ...

  5. 什么时候要进行大小端字节序的转换?

    什么时候要进行大小端字节序的转换? 通过socket收发数据(在intel的处理器上), 什么时候要进行大小端字节序的转换? 比如发一个int型的数据出去,要不要进行转换? 还是两端一样,就不用考虑转 ...

  6. 【C语言】大小端字节序判断 常见笔试题型

    [前言]大家好,我是Catzzz666,一个一心让大家变强的博主.废话不说,让我们进入今天的正题. 大小端的引入: 我们先来看这样一段代码: 在内存中我们创建了局部变量a,那么a在内存中又是如何存储的 ...

  7. 大小端字节序知识详解

     计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian). 举例: 数值0x2211使用两个字节储存:高位字节是0x22,低位字节是0x11. 大 ...

  8. 通信大小端字节序相关问题总结

    [备注:本文主要是将最新box项目中,遇到的问题做以总结梳理,便于加深印象和后续查阅.本文相关资料主要来源于网络,包括转载的一些资料] 遇到问题: 1.何为大.小端存储. 2.若协议中提及" ...

  9. 大小端字节序介绍以及判断当前环境字节序的程序【C语言】

    文章目录 1.大小端字节序介绍 2. 判断当前环境的字节序程序 1.大小端字节序介绍 首先我们先来介绍什么是大端字节序,什么是小端字节序: 大小端字节序指的是数据在电脑上存储的字节顺序 小端字节序存储 ...

最新文章

  1. 计算机模拟组装测试题一,江苏专转本计算机模拟自测试题(一)
  2. 解决Lodop 8443端口找不到CLodopfuncs.js文件问题
  3. Python optionParser模块的使用方法
  4. 如何向mysql表中添加数据类型_java中怎么把data类型的数据添加到数据库?
  5. 就微软启动盗版系统黑屏的个人看法
  6. Hyperledger Besu(4)身份许可
  7. echarts图表大小随着外部div大小变化
  8. 把关与服务的关系_泉州代做投标书-电子标书值得信赖 - 泉州广告服务
  9. c++程序设计中多态与虚函数知识点
  10. 白岩松谈“房闹“现象
  11. java面向对象实现表达式计算,java面向对象课程设计-数学表达式计算器
  12. python—将自定义函数的路径添加到系统路径中
  13. 全球近百所名校课件网络版
  14. 蓝桥杯-奇妙的数字(2015-A-3)
  15. php 网络爬虫开源,phpspider php爬虫框架
  16. 哈哈哈,我终于注册了CSDN的账号
  17. 移动互联网APP测试流程及测试点
  18. 档案管理学 | 档案实体管理概论
  19. DayDayUp:2018年末施瓦辛格热血演讲《关于成功·成功的真谛》—YouTuBe播放量超1个亿!—学习英文
  20. Web 窗体控件简介

热门文章

  1. 20220310在MT6739的android8.1下增加VT设备tty1
  2. Unity 项目中资源管理(续)
  3. Oracle官方文档日记
  4. Ubuntu16.04下安装pip
  5. 实战基于Docker部署FLASK后端api并使用云托管服务
  6. JAVA设计模式是个什么玩意儿_01_工厂方法模式
  7. 深度估计软件DERS5.1软件与配置运行详细步骤
  8. NC212914 牛牛与后缀表达式
  9. 第十二天学习linux
  10. html视频播放器加片头广告,如何屏蔽视频网站的片头广告?一键屏蔽各大视频网站片头广告插件推荐...