内存对齐总结

本文详细解析了GCC编译器下结构体成员变量的内存对齐规则,并通过多个实例展示了不同对齐设置对结构体大小的影响。文章还介绍了如何使用#pragmapack指令来指定特定的对齐方式。

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值