转载自https://www.cnblogs.com/wylnii/p/byte-align-cross-platform.html
视频更详细:1.结构体大小的计算方法
2. 设置内存对齐字节数
举例:8字节对齐
1 #pragma pack(push) //保存对齐状态 2 #pragma pack(8) 3 struct node 4 { 5 char ch; // 1 Byte 6 short sh; // 2 Bytes 7 int in; // 4 Bytes 8 float f; //4 9 double db // 8 10 char *p //4 在32bits机器中所有指针4字节 11 char arr[5];//数组和5个单独类型相等,相当列出5个char在根据原则对齐 12 } 13 #pragma pack(pop)//恢复对齐状态
结果为:占用8*5=40字节
补全原则:补全后是2 4 8的倍数即可
对齐原则:没有满要求对齐的格子要补齐,一个类型必须能整体取出,对齐满足基数
对齐基数:pack(n)和成员中类型占字节最大者(m),二者中取其小者为基数,即 MIN ( n , m);
举例:4字节对齐
1 #pragma pack(push) //保存对齐状态 2 #pragma pack(8) 3 struct node 4 { 5 char ch; // 1 Byte 6 short sh; // 2 Bytes 7 int in; // 4 Bytes 8 float f; //4 9 double db // 8 10 char *p //4 在32bits机器中所有指针4字节 11 char arr[5];//数组和5个单独类型相等,相当列出5个char在根据原则对齐 12 } 13 #pragma pack(pop)//恢复对齐状态
结果为:占用4*8=32字节
优缺点衡量:1.对齐满足 成员最大字节数(m)为基数的话可以增快内存的读取速度,程序效率高,但占空间大,以空间换时间。
2.对齐满足 MIN(n,m),即设置的手动对齐字节(n)可能比成员最大字节要小,则能省下空间,但内存读取效率降低,以时间换空间。
3.实际工作中要看项目要求来取舍,鱼和熊掌不可兼得。