C语言结构体内存对齐

C语言中结构体内存对齐

为什么要内存对齐

内存中存放数据的时候要有一定的规则,这么做得根本原因是要减少CPU访问内存的次数。举个例子,int类型为4个字节,存放int类型的内存的起始地址就是4的倍数,这样CPU访问一次内存就能够取到数据(跟CPU访问内存的机制有关,加上Cache的映射,一般CPU一次访问64字节的数据,也有128字节的)。假设CPU一次访问64字节,那么只有这个int数据起始地址是4的倍数,那么CPU总能一次把它读取成功。假设是2字节对齐,这个数据就有可能存储在第一块的63、64字节和第一块的1、2字节,这样CPU要访问两次内存才能获取一个int类型的数据。这就是内存对齐的意义。

如何对齐

内存对齐的一般规则是数据类型是几个字节起始地址就是几的倍数(不考虑自己pack的情况),typedef的数据类型按照组成它的基本数据类型来算。几个例子:

  1. char :一个字节不用对齐;
  2. short : 两个字节,2 的倍数
  3. int :4 字节, 4的倍数
  4. double :8字节, 8的倍数

结构体对齐

  • typedef struct sta
    {
    char a;
    char b;
    double c;
    }STA_S;
    sizeof(STA_S) = 16 (b后有6个字节的空洞)

  • typedef struct stb
    {
    char a;
    short b;
    int c;
    }STB_S;
    sizeof(STB_S) = 8 [ a(1) + padding(1) + b(2) + c(4) ]

  • typedef struct stc
    {
    short a;
    char b;
    int e;
    }STC_S;

    typedef struct std
    {
    char a;
    short b;
    STC_S c;
    }STD_S;
    sizeof(STD_S) = 12 [ d.a(1) + padding(1) + d.b(2) + d.c.a(2) + d.c.b(1) + padding(1) + d.c.e(4) ]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值