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.hqwc.cn/news/508976.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux逻辑卷管理

一.物理卷,逻辑卷,卷组的关系 二.实验题目 1.业务需要,新增5G硬盘,先对第一块磁盘分区,大小为4G,现在进行逻辑卷划分,卷组名为myvg,逻辑卷名为LV1,大小为2G 2.格式化逻辑卷LV1&#…

web3时事粥报

比特币正成为更具有吸引力的通胀对冲工具 在通胀的宏观经济浪潮中,比特币正逐渐崭露头角,成为那些渴望多元化投资组合的投资者眼中的璀璨明星。Kooner 预测,2024年,各种宏观经济挑战可能进一步提升比特币、黄金和白银等资产的避险…

xsslabs第九关

沿用第八关的思路 显示我的链接并不合法 我们看一下部分源码 <!DOCTYPE html><!--STATUS OK--><html> <head> <meta http-equiv"content-type" content"text/html;charsetutf-8"> <script> window.alert function(…

Linux --- 应用层 | HTTP | HTTPS

前言 前面写的TCP/UDP客户端在访问服务端的时候&#xff0c;需要输入ip地址和端口号才可以访问&#xff0c; 但在现实中&#xff0c;我们访问一个网站是直接输入的一个域名&#xff0c;而不是使用的ip地址端口号。 比如在访问百度 https://www.baidu.com/的时候&#xff0c; …

nextjs13如何进行服务端渲染?

目录 一、创建一个新项目 二、动态获取后端数据进行服务端渲染出现的问题 三、nextjs13如何进行服务端渲染 nextjs13是nextjs的一个重大升级&#xff0c;一些原本在next12当中使用的API在nextjs13上使用十分不便。本文将着重介绍在nextjs13及以上版本当中进行服务端渲染的方…

【ArcPy】游标访问数据

游标类型 类型方法说明搜索游标arcpy.da.SearchCursor检索行更新游标arcpy.da.UpdateCursor更新和删除行插入游标arcpy.da.InsertCursor插入行 使用 搜索游标 遍历所有 结果展示 代码 import arcpy shppath r"C:\Users\admin\Desktop\excelfile\1.shp" with arc…

一文搞定之Qt多线程(QThread、moveToThread)

目录 一、背景 二、线程基础 &#xff08;1&#xff09;使用 QThread 类 &#xff08;2&#xff09;使用 moveToThread() &#xff08;3&#xff09;QThread常用函数及注意事项 &#xff08;4&#xff09;两种方式的缺点 三、线程的同步与互斥 &#xff08;1&#xff0…

怎么换电脑桌面壁纸?一键设置自己喜欢的壁纸

随着科技的不断发展&#xff0c;电脑桌面壁纸的更换变得越来越简单。现在&#xff0c;您只需轻轻一点&#xff0c;就能将您喜欢的图片设置为电脑桌面壁纸。这种一键设置的功能不仅让更换壁纸变得更加便捷&#xff0c;还使得个性化定制成为了可能。怎么换电脑桌面壁纸&#xff1…

如何在手机上中恢复已删除的照片

市场上有大量用于恢复手机已删除照片的应用程序。您可以尝试任何合法的应用程序来恢复意外删除的视频。其中一些应用程序包括 奇客数据恢复、Disk Drill等。 恢复已删除的 Android 照片 如果您不小心从 Android 设备中删除了任何重要视频&#xff0c;无需惊慌。您可以按照这些…

人大金仓KingbaseES:windows安装

人大金仓KingbaseES&#xff1a;windows安装 产品简介 金仓数据库管理系统[简称:KingbaseES]是北京人大金仓信息技术股份有限公司&#xff08;简称人大金仓&#xff09;自主研发的、具有自主知识产权的商用关系型数据库管理系统&#xff08;DBMS&#xff09;。该产品面向事务…

请查收!“全国大学生智能汽车竞赛”线上赛备赛指南

「全国大学生智能汽车竞赛」是教育部倡导的大学生科技A类竞赛&#xff0c;中国高等教育学会将其列为含金量最高的大学生竞赛之一。截至2023年&#xff0c;已经举办十八届&#xff0c;比赛每年吸引包括清华、上交、复旦、北航等500多所高校&#xff0c;超10万名大学生参加&#…

使用 Docker 部署 GLPI 资产管理系统

1&#xff09;GLPI 介绍 GLPI 简介 参考&#xff1a; https://github.com/glpi-project/glpi 官方文档&#xff1a;https://glpi-project.org/documentation/ 中文文档&#xff1a;https://glpi-install.readthedocs.io/zh-cn/latest/ GLPI 提供功能全面的IT资源管理接口&…