C++ 类的大小 原理+详细计算示例

大小的组成

类的大小受:基类,成员,虚基表指针,虚函数表指针 影响。

计算方式

需要按照下列要素对齐和规则计算对齐:

对齐要素

编译器默认对齐数 = 根据环境改变,一般32位为4,64位为8。

有效对齐数 = 编译器默认对齐数(根据环境改变,一般32位为4,64位为8)与 该成员所占字节数的较小值。

最大对齐数 = 最大成员大小 与 编译器默认对齐数取较小值。

对齐规则

1.每个元素的起始偏移量是该元素当前有效对齐数的整数倍。

2.类的大小是最大对齐数的整数倍。

每种情况下的计算示例

统一环境为32位机器。

不考虑继承多态

最简单不要对齐的例子

class A
{
    int a;
};

int a 起始偏移量为0,是有效对齐数4(min(4,8))的0倍。

变量a占偏移量为0,1,2,3的字节,共大小的4字节为最小有效对齐数(4)的整数倍。

需要对齐的例子

对齐偏移量
class A
{
    bool a;
    int b;
};

bool a的起始偏移量为0,占用偏移量为0的字节。

int b的起始偏移量为1,不是当前有效对齐数(min(4,8))的整数倍

偏移量为1,2,3的字节空出,int b从占用偏移量为4,5,6,7的字节。

最终大小为8,为对齐数4的整数倍。

对齐总大小
class A
{
    int* a;
    bool b;
};

int* a占用偏移量为0,1,2,3的字节。

bool b占用偏移量为4的字节。

总大小为5,当前最大对齐数为int*大小与默认对齐数的较小值4,而5不是4的整数倍,故对齐后大小为8。

考虑继承多态

虚函数表与虚基表亦为类的成员(隐藏成员)故需要考虑对齐,聚焦于类的大小,本文就不再阐述继承多态的实现了。

非虚继承

class A
{
    virtual void func() { ; }
    int* a;
    bool b;
};//size:8
class B : public A
{
    virtual void func()override { ; }
    int c;
};

因为不是虚拟继承,B中只继承A的成员。

a占偏移量0~3,b占4,c占8~11。

因为重写了func,故隐藏的虚函数表指针占12~15。

总大小为16刚好为最大对齐数(最大成员大小为4,默认对齐数为4,取最小还是4)的整数倍。

虚继承

class A
{
    virtual void func() { ; }
    int* a;
    bool b;
};//size:8
class B : virtual public A //虚继承
{
    virtual void func()override { ; }
    int c;
};

虚拟继承实现方式为虚基表指针指向虚基类在类中的偏移量,不清楚的可以先移步,笔者的这篇文章中有详细阐述。

彻底理解虚拟继承icon-default.png?t=N7T8http://t.csdnimg.cn/4SpKBc占偏移量0~3的字节。

虚函数表指针占4~7的字节。

虚基表指针占8~11的字节。

虚基类A占12~19的字节(当前最大对齐数为min(8,4)12为4的倍数)。

最大对齐数为min(4,8)=4。

20为最大对齐数的整数倍,最终大小为20。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/427903.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

KMP算法模板

KMP算法模板 自用,相关题解参考

电瓶车充电安全谈|南京小区15死44伤火灾背后的思考

今年2月23日,南京雨花台区明尚西苑居民楼发生了一起重大火灾事故,在事故中,共有59人受到不同程度的伤害,遇难的有15人,另有44人在医院接受治疗。 南京雨花台区火灾的发生无疑是一场令人痛心的悲剧,这场事故…

如何在 Linux 中快速清空文件而不删除它们?

在Linux系统中,清空文件而不删除它们是一种常见的需求,特别是在需要保留文件结构或权限的情况下。本文将详细介绍如何在Linux环境中快速清空文件内容的多种方法,以及每种方法的优缺点。清空文件通常涉及到文件内容的擦除,但并不涉…

【MySQL】事务管理 -- 详解

一、前言 CURD 不加控制,会有什么问题? CURD 满足什么属性,能解决上述问题? 买票的过程得是原子的。买票应该不能受互相的影响。买完票应该要永久有效。买前和买后都要是确定的状态。 什么是事务? 事务就是一组 DML…

DCTNet

DCTNet http://giantpandacv.com/academic/%E7%AE%97%E6%B3%95%E7%A7%91%E6%99%AE/%E9%A2%91%E5%9F%9F%E4%B8%AD%E7%9A%84CNN/CVPR%202020%20%E5%9C%A8%E9%A2%91%E5%9F%9F%E4%B8%AD%E5%AD%A6%E4%B9%A0%E7%9A%84DCTNet/ 一个对输入图像进行频域转换和选择的方法,达到…

Timeout while connecting to “172.168.252.245:161

Timeout while connecting to “172.168.252.245:161” 现象 排查过程 交换机型号H3C,交换机采用SNMPV3协议对接zabbix,交换机配置如下 snmp-agent sys-info version all snmp-agent group v3 zabbix_group privacy read-view isoview snmp-agent …

本地安装部署Flask并结合内网穿透实现远程访问本地web界面

文章目录 1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 本篇文章主要讲解如何在本地安装Flask,以及如何将其web界面发布到公网进行远程访问。 Flask是目前十分流行的web框架,采用Python编程语…

windows下的反调试探究——调用API

NtGlobalFlag 在 32 位机器上,NtGlobalFlag字段位于PEB的0x68的偏移处,64 位机器则是在偏移0xBC位置,该字段的默认值为 0。当调试器正在运行时,该字段会被设置为一个特定的值 该字段包含有一系列的标志位,由调试器创…

(学习日记)2024.03.02:UCOSIII第四节:创建任务

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

【MySQL 系列】在 Windows 上安装 MySQL

在 Windows 平台上安装 MySQL 很简单,并不需要太复杂的步骤。按照本文的步骤操练起来就可以了。 文章目录 1、下载 MySQL 安装程序2、安装 MySQL 数据库2.1、选择安装类型2.2、检查所需组件2.3、安装所选产品组件2.4、产品配置2.5、配置高可用性2.6、配置服务器类型…

UDP协议和TCP协议详解

文章目录 应用层自定义协议 传输层udp协议TCP协议1.确认应答2.超时重传3.连接管理建立连接, 三次握手断开连接, 四次挥手tcp的状态 4.滑动窗口5.流量控制6.拥塞控制7.延时应答8.携带应答9.面向字节流10.异常情况 应用层 自定义协议 客户端和服务器之间往往要进行交互的是“结构…

网络工程师笔记8

华为VRP系统 设备管理方式 web管理方式 命令行管理方式 修改命令:undo 基础配置命令

学习python时一些笔记

1、winr 命令提示符的快捷键 输入cmd进入终端 2、在终端运行桌面上的python文件 cd desktop(桌面) cd是进入该文件夹的意思。 cd .. 回到上一级 运行python时一定要找到文件的所在地 输入python进入,exit()退出%s字符串占位符%d数字占位符%f浮点数占位符input输…

【Python】变量的引用

🚩 WRITE IN FRONT 🚩 🔎 介绍:"謓泽"正在路上朝着"攻城狮"方向"前进四" 🔎🏅 荣誉:2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…

KMP算法和Manacher算法

KMP算法 KMP算法解决的问题 KMP算法用来解决字符串匹配问题: 找到长串中短串出现的位置. KMP算法思路 暴力比较与KMP的区别 暴力匹配: 对长串的每个位,都从头开始匹配短串的所有位. KMP算法: 将短字符串前后相同的部分存储在 n e x t next next数组里,让之前匹配过的信息指…

如何利用pynlpir进行中文分词并保留段落信息

一、引言 nlpir是由张华平博士开发的中文自然处理工具,可以对中文文本进行分词、聚类分析等,它既有在线的中文数据大数据语义智能分析平台,也有相关的python包pynlpir,其github的地址是: Pynlpir在Github上的地址 这…

算法(6)——模拟

一、什么是模拟 模拟是对真实事物或者过程的虚拟。在编程时为了实现某个功能,可以用语言来模拟那个功能,模拟成功也就相应地表示编程成功。 二、模拟算法的思路 模拟算法是一种基本的算法思想,可用于考查程序员的基本编程能力,…

抖店入驻费用是多少?新手入驻都有哪些要求?2024费用明细!

我是电商珠珠 我做电商做了将近五年,做抖店做了三年多,期间还带着学员一起做店。 今天,就来给大家详细的讲一下在抖音开店,需要多少费用,最低需要投入多少。 1、营业执照200元左右 就拿个体店举例,在入…

二叉搜索树题目:将有序数组转换为二叉搜索树

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法证明代码复杂度分析 题目 标题和出处 标题:将有序数组转换为二叉搜索树 出处:108. 将有序数组转换为二叉搜索树 难度 4 级 题目描述 要求 给定整数数组 nums \texttt{nums}…
最新文章