内存字节对齐

本文详细阐述了内存字节对齐的三条原则,并通过实例展示了如何使用#pragma pack宏来调整对齐方式。主要内容包括数据成员对齐规则、结构体作为成员的对齐、收尾工作及#pragma pack的应用效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内存字节对齐要领

3条原则:(在没有#pragma pack宏的情况下,务必看完最后一行)

1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。

2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)

3:收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐.

等你看完此3条原则,2分钟已经过去,抓紧时间,实战3分钟:

代码

#include <stdio.h>
#pragma pack(8)
typedef struct bb{
    int id;             //&BB.id=00000000      [0]....[3]
    double weight;      //&BB.weight=00000008  [8]....[15] 原则1
    float height;       //&BB.height=00000010  [16]...[19] 原则3
                            //总长要为8的整数倍,补齐[20]...[23]    
}BB;                        //sizeof(BB)=24

typedef struct aa{
    char name[2];           //&a.name=00000000 [0]-[1]
    int id;                 //&a.id=00000004   [4]-[7]  原则1
    double score;           //&a.score=00000008[8]-[15] 
    short grade;            //&a.grade=00000010[16]-[17] 
    BB b;                   //&a.b=00000018    [24]-[47] 原则2
}AA;                        //sizeof(a)=48

int main(void)
{

    BB x;
    char*p=(char*)&x.id;
    printf("&x.id=%p \n",p-(char*)&x.id);
    p=(char*)&x.weight;
    printf("&x.weight=%p \n",p-(char*)&x.id);
    p=(char*)&x.height;
    printf("&x.height=%p \n",p-(char*)&x.id);
    printf("sizeof(BB)=%d\n\n",sizeof(BB));


    AA a;
    p=(char*)&a.name;
    printf("&a.name=%p \n",p-(char*)&a.name);
    p=(char*)&a.id;
    printf("&a.id=%p \n",p-(char*)&a.name);
    p=(char*)&a.score;
    printf("&a.score=%p \n",p-(char*)&a.name);
    p=(char*)&a.grade;
    printf("&a.grade=%p \n",p-(char*)&a.name);
    p=(char*)&a.b;
    printf("&a.b=%p \n",p-(char*)&a.name);
    printf("sizeof(a)=%d\n",sizeof(a));

}

结果是

sizeof(a))=48 sizeof(BB)=24
ok,上面的全看明白了,内存对齐基本过关.

再讲讲#pragma pack().

在代码前加一句#pragma pack(1),你会很高兴的发现,上面的代码输出为

32 16
bb是4+8+4=16,aa是2+4+8+2+16=32;

这不是理想中的没有内存对齐的世界吗.没错,#pragma pack(1),告诉编译器,所有的对齐都按照1的整数倍对齐,换句话说就是没有对齐规则.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值