一图看懂结构体对齐

一图看懂结构体对齐

为什么需要结构体对齐?根本原因在于CPU访问数据的效率问题

  • 不是所有的硬件平台都能访问任意地址的任意数据,某些硬件平台只能在某些地址处取某些特定类型的数据的,否则抛出异常。
  • 数据结构(尤其是栈)应尽可能在自然边界上对齐,因为在访问为对齐的内存时,处理器需要访问多次,而对齐的内存处理器只需要访问一次。

对齐原则

  • 以 #pragma pack(x) 中 x 的大小和结构中占用空间最大的成员做比较,取小值为 n(外对齐依据)
  • 以 n 值和结构体每个成员比较,得出结果列表为 m[x]
  • 根据每个成员的大小依次向内存中填充数据,要求填充 成员的起始地址 减去 构体起始地址 的差都可以整除 m[x] ,如不能整除则向后移动,直到可以整除再填充成员到内存(内对齐依据)
  • 当全部成员填充完毕后所占用的字节若不能整除 n,则扩充内存到可以整除 n 为止。
#include <stdio.h> 
#pragma pack(4) 
typedef struct data { 
    char a; 
    short b; 
    int c; 
} DATA, *PDATA; 

int main(int argc, char* argv[])
{ 
    printf("sizeof(DATA) = %lu\n", sizeof(DATA)); return 0; 
}

在这里插入图片描述

#include <stdio.h>

#pragma pack(8)

typedef struct data
{
    char a;
    double b;
    int c;
} DATA, *PDATA;

int main(int argc, char* argv[])
{
    printf("sizeof(DATA) = %lu\n", sizeof(DATA));
    return 0;
}

在这里插入图片描述

上面是比较严谨的理解,画图的话最简单。

struct A{
    int a; // 4
    char b; // 1
    short c;// 2
};

struct B{
    char b;
    int a;
    short c;
};

#pragma pack(2) // 指定对齐字节
struct C{
    char b;
    int a;
    short c;
};
#pragma pack() // ,取消指定字节对齐,恢复缺省字节对齐

int main(int argc, char **argv) 
{
    printf("sizeof(A):%zd\n", sizeof(struct A));
    printf("sizeof(B):%zd\n", sizeof(struct B));
    printf("sizeof(C):%zd\n", sizeof(struct C));

    return 0;
}

A结构体【8字节】

aaaa
bcc

B结构体【12字节】

b
aaaa
cc

C结构体【8字节】

b
aa
aa
cc

结构体对齐在嵌入式软件编程中很重要,要引起足够重视,希望对你有所帮助。

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

量子孤岛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值