gcc貌似默认按4对齐
#pragma pack(n),n=1,2,4,8,16可以改变对齐方式
struct A
{
double l;
int i;
int b;
char c;
};
32位系统:double 8字节 int 4字节 char 1字节
结构体A所在字节为8+4+4+8=24。原因double占8字节,两个int刚好占8字节,char按8字节对齐
gcc下字节数为8+4+4+4=20。因为gcc默认按4字节对齐,char不够4字节补足4字节而不是8
struct A
{
int l;
int i;
int b;
char c;
};
对结构体做如上修改,double改为int,由于最大占4字节,所以char按4字节补齐,而不是8字节。
struct A
{
double l;
int i;
int b;
};
struct B
{
int i;
double l;
int b;
};
A所占字节为8+4+4=16,B所占字节为8+8+8=24。因为A中两个int在double之后,在分配内存时刚好能分配8字节内存。在B中double在两个int之间,而double所占字节数大于int,因此将int按8字节对齐。
在32位系统中指针占4字节(4*8=32),64位系统中指针占8字节(8*8=64)。
#pragma pack(n)
#pragma pack(1)
struct A
{
bool l;
int b;
double i;
};
按1字节对齐,可以直接计算,1+4+8=13
#pragma pack(2)
struct A
{
bool l;
int b;
double i;
};
按2字节对齐,分配的内存为2的倍数,bool补满2字节,2+4+8=14
#pragma pack(8)
struct A
{
bool l;
int b;
double i;
};
按8字节对齐,2+4<8,8+8=16
结构体中有结构体的情况
struct A
{
int i;
double j;
};
struct B
{
A a;
int i;
};
此时B大小为24,计算B时由于A此时是按8字节对齐,而i只占4字节,因此B中按8字节对齐
struct A
{
int i;
bool j;
};
struct B
{
A a;
double j;
};
再看个例子,A按4字节对齐,占8字节,B中double占8字节,比A的对齐方式大,因此A a按8字节对齐double j。sizeof(B)=16
本文详细解析了GCC编译器下结构体成员变量的内存对齐规则,并通过多个实例展示了不同对齐设置对结构体大小的影响。文章还介绍了如何使用#pragmapack指令来指定特定的对齐方式。
1297

被折叠的 条评论
为什么被折叠?



