内存对齐

本文介绍了内存对齐的概念及其目的,并通过实例演示了不同编译环境下结构体内存对齐的实现方式,包括对齐原则和对齐方式。

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

  • 概念:是一个数据类型所能存放的内存地址的属性又称字节对齐。如一个数据类型的内存对齐为8时,这个数据类型所定义出来的所有变量其内存地址都是8的倍数。

  • 自然对齐:对齐属性和数据类型的大小相等,如4字节大小的int型数据默认它的字节对齐也是4。

  • 目的:内存对齐可以提高CPU读取内存的效率。(32位的x86 CPU,一个时钟周期可以读取4个连续的内存单元,即4字节),如一个int放在奇数内存位置上,想把这4个字节读出来,32位CPU就需要两次,但对齐之后一次就可以了。

  • 对齐方式

    对于结构体来说,默认的对齐将等于其中对齐最大的成员的对齐值。

  • 测试

    
    #include <iostream>
    
    using namespace std;
    
    struct ts
    {
      char a;         // 1 byte
      int b;          // 4 bytes
      short c;        // 2 bytes
      long long d;    // 8 bytes
      char e;         // 1 byte
    };
    
    int main(int argc, char *argv[])
    {
      cout << sizeof(ts) << endl;//32
      return 0;
    }
    

    64 位机,可以按8字节对齐

    img

    32 位机,在gcc + 32位linux中,大小超过4字节的基本类型仍然按4字节对齐

    img

  • 对齐原则

    • 数据成员对齐原则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。
    • 结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储)
    • 收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值