内存对齐问题(结构体,联合体,位段)

本文探讨内存对齐在结构体、联合体和位段中的应用,包括数据成员对齐规则、结构体整体对齐规则以及特殊情况分析。内存对齐有助于提高访问效率,但也可能导致内存浪费。联合体的大小取决于其最大成员的大小,而位段则涉及复杂的内存布局策略。
摘要由CSDN通过智能技术生成

结构体

typedef struct A
{
    char c1;
    char c2;
    int i;
}A;
typedef struct B
{
    char c1;
    int i;
    char c2;
}B;
typedef struct C
{
    int i;
    char c1;
    char c2;
}C;

对于结构体A,B,C.它们具有同样的结构体成员,只是调换了先后顺序,我们来观察它们的大小是否相同?

int main()
{
    printf("结构体A:%d\n",sizeof(A));
    printf("结构体B:%d\n",sizeof(B));
    printf("结构体C:%d\n",sizeof(C));
    return 0;
}

这里写图片描述
结果显示在sizeof计算结构体大小时,经常得到的值比结构体成员所占内存总和要大,这是因为成员在存储时有对齐的规则。
结构体对齐的规则
1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
3、结合1、2可推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。
先来剖析一下上述结构体的内部存储结构:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值