详解c++中的sturct
在c中struct只能存放数据在c中为其扩展了创建成员函数的功能struct中的成员默认都是public的struct的继承默认也是public并且它是无法用于定义模板参数这是它与class的主要区别。虽然在c中struct可以定义成员函数不过我们还是将它主要用于定义一些 POD(plain old data)在 C11 及之后的标准中POD 类型需要同时满足两个独立条件平凡类型具有默认的构造/拷贝/移动/析构函数可自动生成且非虚标准布局Standard Layout内存布局与 C 兼容成员排列顺序符合特定规则同时满足平凡性和标准布局的类型称为 POD 类型这类数据可以安全使用 memcpy 等底层内存操作因为它们的内存布局与 C 完全兼容且没有特殊处理需求。内存对齐内存对齐主要有三点原因一是为了提高cpu的访问效率cpu在读取时是按照块进行读取的比如64位系统一般一次性读取8字节。二是早期某些平台不对齐访问会直接崩溃或触发异常三是为了保证原子操作原子指令通常要求数据对齐否则无法保证原子性。内存对齐的基本规则每个成员按照其自身大小对齐char按1字节int按4字节double按8字节成员的起始地址必须是其对齐值的整数倍struct整体大小必须是最大对齐值的整数倍举例structExample1{chara;// 偏移0占用1字节// 填充7字节让double从8的倍数开始doubleb;// 偏移8占用8字节charc;// 偏移16占用1字节// 填充7字节使总大小为8的倍数};// 总大小24字节structExample2{doubleb;// 偏移0占用8字节chara;// 偏移8占用1字节charc;// 偏移9占用1字节// 填充2字节偏移10-11← int 需要4字节对齐intd;// 偏移12占用4字节 ← 10不是4的倍数要从12开始};// 总大小16字节 ✓structExample3{// 从大到小排列doubleb;// 偏移0占用8字节intd;// 偏移8占用4字节chara;// 偏移12占用1字节charc;// 偏移13占用1字节// 填充2字节偏移14-15使总大小为8的倍数};// 总大小16字节在内存对齐的情况下我们想要访问一个数据cpu都只需要读取一次内存假设没有内存对齐拿Example1的成员顺序举例内存的前8字节会存放一个完整的char a1字节和double b的前7字节。如果我们想要访问这个double bcpu就需要访问两次内存才能拼凑出完整的数据。为了提高运行效率和确保稳健性一般建议开启内存对齐小建议按从大到小的顺序声明成员可以减少内存浪费参考Example3在一些嵌入式设备中内存是比较宝贵的内存对齐虽然可以提高运行效率但会浪费一些内存空间这时候我们可以通过#pragma pack来关闭内存对齐用时间换空间。// 正常对齐默认structNormal{chara;// 1字节// 填充7字节doubleb;// 8字节charc;// 1字节// 填充7字节};// 总大小24字节// 1字节对齐取消填充#pragmapack(1)structPacked1{chara;// 1字节doubleb;// 8字节charc;// 1字节};// 总大小10字节#pragmapack()// 恢复默认对齐// 2字节对齐#pragmapack(2)structPacked2{chara;// 1字节// 填充1字节doubleb;// 8字节按2字节对齐每次最多填充1字节charc;// 1字节// 填充1字节};// 总大小12字节#pragmapack()// 4字节对齐#pragmapack(4)structPacked4{chara;// 1字节// 填充3字节doubleb;// 8字节按4字节对齐charc;// 1字节// 填充3字节};// 总大小16字节#pragmapack()//恢复正常对齐intmain(){printf(Normal: %zu 字节\n,sizeof(Normal));printf(Pack(1): %zu 字节\n,sizeof(Packed1));printf(Pack(2): %zu 字节\n,sizeof(Packed2));printf(Pack(4): %zu 字节\n,sizeof(Packed4));return0;}//输出Normal:24字节Pack(1):10字节Pack(2):12字节Pack(4):16字节
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2515382.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!