sizeof 计算 struct 占字节数的方法总结
矛盾焦点: 1、结构体的内存对齐方式 ? 字节对齐的目的: 1、提高CPU存储变量的速度 ? 计算的核心点(默认对齐方式): 1、结构体内的每一个成员的起始地址跟结构体起始地址的偏移量要刚好是自己字节数的整数倍,不足则自动填充。 2、结构体总的字节大小要刚好是结构体的字节边界数的倍数,不足则自动填充。(字节边界数:结构体中占用最大空间的类型的字节数) 3、static修饰的结构体成员不占用结构体字节数,因为静态变量的存储地址跟结构体的实例地址无关。 4、空结构体的字节数为1,因为必须保证结构体的实例地址唯一。 ? 计算的核心点(#pragma pack设置字节对齐大小): #pragma pack(push) #pragma pack(n) ... #pragma pack(pop) 一、结构体每个成员的地址偏移量 1、如果n大于等于当前成员的字节数,则当前成员的地址偏移量要刚好是自己字节数的整数倍,不足则自动填充。 2、如果n小于当前成员的字节数,则当前成员的地址偏移量要刚好是n的整数倍,不足则自动填充。 二、结构体总的字节数 1、如果n大于等于结构体中占用最大空间的类型的字节数,则结构体总字节数大小要刚好是结构体中占用最大空间的类型的字节数的整数倍。 2、如果n小于结构体中最大空间的类型的字节数,则结构体总字节数的大小要刚好是n的整数倍。 ? 计算的核心(补充): 1、static修饰的结构体成员不占用结构体字节数,因为静态变量的存储地址跟结构体的实例地址无关。 2、空结构体的字节数为1,因为必须保证结构体的实例地址唯一。 ? //try 一 try struct F { char a; short b; double c; float d; char e; }; int FCount = sizeof(F); cout << "F count = " << FCount << endl; //F count = 24 #pragma back(push) #pragma pack(2) struct E { char a; short b; double c; float d; char e; }; #pragma back(pop) int ECount = sizeof(E); cout << "E count = " << ECount << endl; //E count = 18 上述代码有一个疑问点:https://www.cnblogs.com/azbane/p/11299354.html ? //try 一 try struct FF { char a; short b; double c; float d; char e; static double h; }; int FFCount = sizeof(FF); cout << "FF count = " << FFCount << endl; //FF count = 24 struct G { }; int GCount = sizeof(G); cout << "G count = " << GCount << endl; //G count = 1 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |