C++ 结构体内存对齐

定义了两个结构体

 typedef struct Cmd {uint8_t ua;uint8_t ub;uint8_t uc;uint32_t ue;
} Cmd_t;typedef struct Cmd_tag {uint8_t value;uint8_t data[1]; // 将 data 定义为指向 Cmd_t 结构体的指针
} tag_t;

在实际使用中,看见前人的代码是,new 一块内存放两个结构体。我对内存大小有些疑惑。代码如下

void test2()
{int size = 9;unsigned char* pdata = new unsigned char[size];memset(pdata, 0, size);// 解释 pdata 为 tag_t* 类型的指针tag_t* pCmd = (tag_t*)pdata;pCmd->value = 1;// 将 pdata + 1 解释为 Cmd_t* 类型的指针,并将其赋给 data 成员Cmd_t*  p= (Cmd_t*)(pdata + 1);p->ua = 10;p->ub = 10;p->uc = 10;p->ue = 10;std::cout << "value: " << static_cast<int>(pCmd->value) << std::endl;std::cout << "Address of pCmd->value: " << static_cast<void*>(&pCmd->value) << std::endl;std::cout << "data->a: " << static_cast<int>(p->ua) << std::endl;std::cout << "Address of p->a: " << static_cast<void*>(&p->ua) << std::endl;std::cout << "data->ub: " << static_cast<int>(p->ub) << std::endl;std::cout << "Address of p->ub: " << static_cast<void*>(&p->ub) << std::endl;std::cout << "data->uc: " << static_cast<int>(p->uc) << std::endl;std::cout << "Address of p->uc: " << static_cast<void*>(&p->uc) << std::endl;std::cout << "data->ue: " << p->ue << std::endl;std::cout << "Address of p->ue: " << static_cast<void*>(&p->ue) << std::endl;delete[] pdata;
}

输出如下
在这里插入图片描述
解释:

 std::cout << "Size of tag_t: " << sizeof(tag_t) << " bytes" << std::endl;std::cout << "Size of Cmd_t: " << sizeof(Cmd_t) << " bytes" << std::endl;
// Size of tag_t: 2 bytes//Size of Cmd_t: 8 bytes

结构体 tag_t需要2 bytes
结构体 Cmd_t 需要 8 bytes

一开始我以为,new一块内存存放她两需要 2+8 =10 bytes
但是由于 将 pdata + 1 解释为 Cmd_t* 类型的指针,并将其赋给 data 成员

Cmd_t*  p= (Cmd_t*)(pdata + 1);

相当于 Cmd_tag.data 和 Cmd_t.ua公用一个字节的内存

所以new的时候只需要 9 bytes

.还有一个坑:
最开始计算Cmd_t大小时 ,我以为是7bytes. 后来发现C++ 结构体在这里右4字节对齐
可以观察输出, p->ue的地址比 p->uc的地址增加了 2
所以如果代码里,size =8 程序会崩溃

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

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

相关文章

【Redis】Redis面试和工作中十有八九会遇到的问题

1. 数据类型 常用的Redis数据类型有5种&#xff0c;分别是&#xff1a; String、List、Set、SortedSet、Hash 还有一些高级数据类型&#xff0c;比如Bitmap、HyperLogLog、GEO等&#xff0c;其底层都是基于上述5种基本数据类型。因此在Redis的源码中&#xff0c;其实只有5种数…

Kubernetes集群自动化部署

目录 1.1 实验介绍 1.1.1 关于本实验 1.1.2 实验目的 1.2 环境准备 步骤 1 设置节点名 步骤 2 配置 hosts 节点名解析 步骤 3 配置免密登录 步骤 4 清空 iptables、关闭防火墙并禁用 selinux 步骤 5 关闭交换分区 步骤 6 开启 ipvs 步骤 7 设置时间同步 步骤 8 配置…

Linux程序开发(一):Linux基础入门安装和实操手册

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

怎样让猫给啥吃啥?生骨肉冻干拌粮哪有猫咪不吃的!

随着科学养猫的普及&#xff0c;生骨肉冻干喂养越来越受欢迎&#xff0c;生骨肉冻干喂养对猫的好处很多&#xff0c;它符合猫咪的天性&#xff0c;可以提供全面的营养&#xff0c;保持牙齿和牙龈的健康&#xff0c;还有助于维持健康的消化系统。然而&#xff0c;许多猫主人在选…

5个不同类型的AI问答机器人你都用过吗?

在科技发达的今天&#xff0c;AI问答机器人已经深入我们的日常生活&#xff0c;各式各样的机器人应用在生活的方方面面。本文给大家推荐5个不同类型的AI问答机器人&#xff0c;看看你都用过哪些&#xff0c;或者有没有兴趣尝试一下呢&#xff1f; 1.高效知识库型&#xff1a;He…

openstack部署nova中出现的问题:

[rootcontroller nova]# su -s /bin/sh -c “nova-manage db sync” nova /usr/lib/python2.7/site-packages/pymysql/cursors.py:170: Warning: (1831, u’Duplicate index block_device_mapping_instance_uuid_virtual_name_device_name_idx. This is deprecated and will be…

小程序框架是智能融媒体平台构建的最佳线路

过去5年&#xff0c;媒体行业一直都在进行着信息化建设向融媒体平台建设的转变。一些融媒体的建设演变总结如下&#xff1a; 新闻终端的端侧内容矩阵建设&#xff0c;如App新闻端&#xff0c;社交平台上的官方媒体等新闻本地生活双旗舰客户端&#xff0c;兼顾主流媒体核心宣传…

服务网格 SolarMesh v1.13 重磅发布

SolarMesh是行云创新推出的流量治理平台&#xff0c;它基于Istio&#xff0c;为部署在K8s集群上的应用提供全面的流量治理能力。 在之前的版本中&#xff0c;SolarMesh提供的能力有&#xff1a;流量视图&#xff0c;流量控制策略批量配置&#xff0c;API级别的流量数据采集和展…

一种基于电场连续性的高压MOSFET紧凑模型,用于精确表征电容特性

来源&#xff1a;A Compact Model of High-Voltage MOSFET Based on Electric Field Continuity for Accurate Characterization of Capacitance&#xff08;TED 24年&#xff09; 摘要 本文提出了一种新的高压MOSFET&#xff08;HV MOS&#xff09;紧凑模型&#xff0c;以消…

基于微信小程序+JAVA Springboot 实现的【房屋租赁管理系统】app+后台管理系统 (内附设计LW + PPT+ 源码+ 演示视频 下载)

项目名称 项目名称&#xff1a; 基于微信小程序的房屋租赁管理系统 在本次项目开发中&#xff0c;我们成功构建了一款基于微信小程序的房屋租赁管理系统&#xff0c;旨在通过现代化信息技术提升房屋租赁服务的效率和质量。以下是对本项目的全面总结&#xff1a; 项目背景与目…

十款开源数据集成工具

在大数据作业开发中&#xff0c;数据集成工具是非常重要的一个环节&#xff0c;一个好的数据集成系统从可用性、架构扩展性、底层引擎选型、数据源支持能力等方面都需要一定的考量&#xff0c;在本文中汇总了十款开源的数据集成系统&#xff0c;作者本人在过往的开发过程中&…

Transformer - Self-Attention层的复杂度的计算

Transformer - Self-Attention层的复杂度的计算 flyfish 矩阵的维度 下面矩阵的维度是32即 3行&#xff0c;2列 6,10等都是矩阵里的元素 如果矩阵A的列数与矩阵B的行数相同&#xff0c;那么这两个矩阵可以相乘。即&#xff0c;若A是一个mn矩阵&#xff0c;B是一个np矩阵&am…