C++类字节对齐

2023-11-07

在c语言中,结构体有字节对齐,c++中的类也有字节对齐。在c++里的字节对齐和struct里类似下面我们看看字节对齐的规则和许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k(通常它为4的倍数,这就是所谓的字节对齐,而这个k则被称为该数据类型的对齐模数(alignment modulus)。当一种类型S的对齐模数与另一种类型T的对齐模数的比值是大于1的整数,我们就称类型S的对齐要求比T强(严格),而称T比S弱(宽松)。下面来讨论4种不同类型的

对齐模数:

内置类型的自身对齐模数(有符号无符号相同)
char 1
short 2
int 4
float 4
double 8

自定义类型的自身对齐模数(struct 、class)
等同于其成员中最大的自身对齐模数 指定对齐模数
我们给编译器指定的对齐模数(在VC中使用指令:#pragma pack(n),如果不指定,在VS2010默认为8)
有效对齐模数 指定对齐模数与类型自身对齐模数的较小的值,就是实际生效的对齐模数。

字节对齐三规则:

其实字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;例如上面第二个结构体变量的地址空间。
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。

在C++类里在没有任何数据类型变量的时候,会有一个字节的空间占用,如果有数据类型变量就会有字节对齐,例如:
这里写图片描述
输出为八个字节,首相类开始占空间大小是数据类型最大类型四个字节,下面是数据类型来说,int类型是四个字节,是char类型的整数倍,二者一加是五个字节,五个字节不是刚开始类占用空间四个字节的整数倍,这里就需要对齐,比五大四的最小整数倍是8个字节,其他字节对齐和该例子一样。

还有一种是最容易忽略的就是有虚函数的时候也会占用4个字节的空间,

这里写图片描述
在这里可以看到,当有虚函数的存在时候会占用四个字节的空间,原因是因为如果有虚函数存在在构造对象的时候会多构造一个虚指针。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++类字节对齐 的相关文章

随机推荐

  • 基于lua-nginx-module(openresty)的WEB应用防火墙

    独乐乐 不如众乐乐 分享给大家一篇WEB应用防火墙的文章 基于Lua Nginx实现 以下是ngx lua waf的作者全文输出 Github地址 https github com loveshell ngx lua waf ngx lua
  • MySQL 5.7 root登录问题

    For Mac 安装完成后 当使用 mysql u root p 登录时 出现下面错误 ERROR 1045 28000 Access denied for user root localhost using password NO 可通过
  • 正则替换下划线为字母大写

    本人需要手工将数据库中的字段批量转换为java对象的字段 比如 将TRADE DATE 转换为 tradeDate 最终的结果为 1 xxx xml 格式如下 result property tradeDate column TRADE D
  • calendar 字符串日期转时间戳

    public class TestDate public static void main String args SimpleDateFormat dateFormat new SimpleDateFormat yyyy MM dd 指定
  • github上传本地项目代码

    github上传本地项目代码 小白教程 github上申请一个账号 https github com 下载一个git工具 https gitforwindows org 进入github首页 点击新项目new repository 如下图所
  • Java中Comparable和Comparator区别小结

    阅读目录 一 Comparable简介 二 Comparator简介 三 Comparable和Comparator区别比较 回到顶部 一 Comparable简介 Comparable是排序接口 若一个类实现了Comparable接口 就
  • Codeforces Round 883 (Div. 3)

    A Rudolph and Cut the Rope 只需要按照钉子距离的高度a i 和绳子的长度b i 的差值进行排序即可 代码 int n pii a N bool cmp pii a pii b return a x a y
  • python爬虫总是爬不到数据,你需要解决反爬虫了

    爬虫最讨厌的就是反爬虫 但是如果没有反爬虫的存在的 那么大家都可以随随便便就进行网络爬虫 那么服务器又怎么支撑得起来呢 那么又怎么彰显我们的能力呢 所以说反爬虫是一个门槛 跨过这一个门槛就可以轻松掌握爬虫的技术了 跨不过那么你就一直都在起点
  • element-ui中el-input输入时自定义校验,并且调后端接口查重

    一 实现效果 1 只能属于正整数 2 只能属于7位或者9位 3 输入时实时校验 4 查重 不能输入列表存在的 除自己之外
  • 博图v16组态wincc_「博图+仿真+授权」西门子软件安装指南及注意事项

    写在前面 最近一段时间 很多小伙伴通过我们公众号 thinger swj的文章开始学习西门子PLC及西门子仿真环境搭建 但是很不幸的是 由于系统原因或者其他未知原因 经常会遇到各种各样的问题 因此本文主要针对博图V16安装 PLCSIM A
  • C++默认构造函数提供机制

    C 的构造函数有 默认构造函数 析构函数 拷贝构造函数 拷贝赋值函数 移动构造函数 移动赋值函数 生成这些特殊成员函数 或不生成 的规则比较复杂 每个特殊成员函数有几种不同的状态 隐式声明还是用户声明 默认提供还是用户提供 正常状态还是删除
  • vue3-element-plus,控制表格多选的数量

    1 需求描述 控制表格的多选 最多只能选择5条数据 并且其他项禁用 2 需求描述
  • Hadoop002-hdfs架构

    1 名字节点 namenode 可以看做是分布式文件系统中的管理者 它1负责管理文件系统命名空间 集群和数据块复制等 2 数据节点 datanode 是文件存储的基本单位 它以数据块的形式保存了HDFS中文件的内容和数据块的数据校验信息 3
  • 52条SQL语句性能优化策略,建议收藏

    点上方蓝色 菜鸟学Python 选 星标 公众号 重磅干货 第一时间送到 转自 SimpleWu 链接 cnblogs com SimpleWu p 9929043 html 本文会提到 52 条 SQL 语句性能优化策略 1 对查询进行优
  • Ansible实现自动部署简述

    一 操作过程 以JDK安装部署过程为例 1 服务器准备 为受管服务器配置公钥进行连接 安装命令 yum y install epel release yum y install ansible 生成公钥 ssh keygen t rsa P
  • 抓取招聘信息:从招聘网站获取职位信息

    目录 1 抓取招聘信息简介 2 准备工作 3 分析招聘网站结构 4 编写招聘信息爬虫
  • 怎么选择俄罗斯服务器?要注意什么?

    一 俄罗斯服务器的性能 为了保证网络能正常运转 选择的俄罗斯服务器首先要确保稳定 因为一个性能不稳定的服务器 即使配置再高 技术再先 进 也不能保证网络能正常工作 严重的话可能给使用者造成难以估计的损失 另外一方面 性能稳定的服务器还意味着
  • vscode高亮插件与自定义注释代码插件说明

    一 highlight icemode插件 选中高亮显示 highlight icemode插件如下图所示 2 插件安装好后 需要配置一下高亮显示颜色 如下图所示 二 snippet插件 增加自定义注释说明 snippet插件如下图所示 2
  • 模拟电路技术之基础知识(三)

    基放的进阶 笔记总目录 文章目录 第三章 多级放大电路 多级放大电路的耦合方式 直接耦合 阻容耦合 变压器耦合 光电耦合 多级放大电路的动态分析 直接耦合放大电路 直流耦合放大电路的零点漂移及其产生的原因 差分放大电路 电路的组成 长尾式差
  • C++类字节对齐

    在c语言中 结构体有字节对齐 c 中的类也有字节对齐 在c 里的字节对齐和struct里类似下面我们看看字节对齐的规则和许多实际的计算机系统对基本类型数据在内存中存放的位置有限制 它们会要求这些数据的首地址的值是某个数k 通常它为4的倍数