- /*
- 原则1、数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。
- 原则2、结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储。)
- 原则3、收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。
- */
- #include <iostream>
- using namespace std;
- struct A
- {
- short a; //大小为2, 因为b的大小是4,所以要补2
- int b; //大小为4
- char c; // 大小为1
- // 所以2+2+4+1+3 = 12 ,最后的三,因为“原则3”,9并不是4的倍数,所以需要补3
- };
- struct B
- {
- int a; // 大小为4,
- char b; // 大小为1,因为c大小为2,所以b需要补1
- short c; //大小为2
- // 所以4+1+1+2 = 8(也满足原则3)
- };
- struct C
- {
- int a; // 大小为4,开始为0,不用补位
- double b; // 大小为8,开始不是8的倍数,所以int后要补4位
- float c; // 大小为8, 地址正好是8的倍数,所以不用补位
- // 所以 4+4+8+8 = 24;
- };
- struct D
- {
- char e[2]; //大小为2,因为f为4,所以补2 = 4
- int f; // 大小为4,因为e补了2所以g的起始地址正好是8的倍数,所以不用补位
- double g; // 大小为8
- float h; // 大小为8
- struct C i; // 因为前面总数为8的倍数(C的最大值为8)所以不用补位(总大小为24)
- // 所以 2+2+4+8+8+24 = 48,满足第三条
- };
- int main(int argc, char *argv[])
- {
- QCoreApplication a(argc, argv);
- cout << "sizeof(A)=" << sizeof(A) << endl;
- cout << "sizeof(B)=" << sizeof(B) << endl;
- cout << "sizeof(C)=" << sizeof(C) << endl;
- cout << "sizeof(D)=" << sizeof(D) << endl;
- return a.exec();
- }
c语言数据结构补齐原则
最新推荐文章于 2023-06-09 17:08:23 发布