有时会在c/c++中看到这种形式
#pragma pack(n)
#pragma pack()
前一句代表设置对齐的字节数为n,而不是编译器默认的对齐字节数(ubuntu 14.04 x86_64下为8),后一句代表恢复默认值,合理地使用内存对齐能减少程序占用的内存空间,使用不当也会降低存取效率从而降低程序性能。在分析内存对齐时,只需要采用以下的原则,这里以一段代码简单解释下
#include <stdio.h>
#include <stdlib.h>
int main()
{
//缺省,一般8字节对齐
//struct有成员字节大于pack值,对齐为pack的整数倍=>24
struct default_pack_struct_size_bigger {
struct c {
long long a;
char d;
} m;
char b;
};
printf("default_pack_struct_size_bigger:%d\n",(int)sizeof(struct default_pack_struct_size_bigger));
//struct成员字节数都小于pack,按字节数最大的对齐=>4
struct default_pack_struct_size_smaller {
char a;
short int b;
};
printf("default_pack_struct_size_smaller:%d\n",(int)sizeof(struct default_pack_struct_size_smaller));
//设置pack为4
#pragma pack(4)
//结构成员有大于4字节的 => 12
struct pack_4_struct_size_bigger {
unsigned short int a;
long long b;
};
printf("pack_4_struct_size_bigger:%d\n",(int)sizeof(struct pack_4_struct_size_bigger));
//结构成员都小于4字节 => 4
struct pack_4_struct_size_smaller {
char a;
unsigned short int b;
};
printf("pack_4_struct_size_smaller:%d\n",(int)sizeof(struct pack_4_struct_size_smaller));
#pragma pack()
return 0;
}
结果:
时间: 2024-10-30 22:27:10