美文网首页
结构体内存对齐

结构体内存对齐

作者: Mr木子李 | 来源:发表于2022-04-23 15:23 被阅读0次

结构体的对齐方式
首先了解:结构体和数组一样都是一块连续的内存空间。

image

结构体内存对⻬分为3个部分:
1.基本类型数据成员:结构体的第一个数据成员放在偏移量为0的地址,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小的整数倍开始(int为4字节,则要从4的整数倍地址开始存储,哪怕前面有一点空间浪费)。
2.结构体类型数据成员:结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a 包含成员 struct b,struct b 的数据成员有有char、int 、double等类型,那b应该从8的整数倍(double的大小)开始存储)。
3.整体字节对齐:结构体的总大小,也就是sizeof的结果必须是其内部最大成员的整数倍,不足的要补⻬。
验证代码:(这里简化了内存编号,实际例如 0x7abc001 等)


struct LGStructOne {
    // 8字节,0~7 ,
    double a;
    // 1字节,9
    char b;
    // 4字节,12~15
    int c;
    // 2字节,16~17
    short d;
    // 总的大小按最大成员所占的8字节进行对齐,所以占24字节
}structOne;

struct LGStructTwo {
    // 8字节,0~7
    double a;
    // 4字节,8~11
    int b;
    // 1字节,12
    char c;
    // 2字节,14~15
    short d;
    // 总的大小按最大成员所占的8字节进行对齐,所以占16字节
}structTwo;

struct LGStructThree {
    // 8字节,0~7
    double a;
    // 4字节,8~11
    int b;
    // 1字节,12
    char c;
    // 2字节,14~15
    short d;
    // 4字节,16~21
    int e;
    // 24字节,且最大成员占8字节,24~47
    struct LGStructOne lgStruct;
    // 总的大小按最大成员所占的8字节进行对齐,所以占48字节
}structThree;

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // Setup code that might create autoreleased objects goes here.
        NSLog(@"\n structOne'size = %lu;\n structOne'size = %lu;\n structOne'size = %lu;\n",
              sizeof(structOne),sizeof(structTwo),sizeof(structThree));
    }
    return NSApplicationMain(argc, argv);
}

/*
 structOne'size = 24;
 structOne'size = 16;
 structOne'size = 48;
 */



Tips: 为什么要从倍数大小开始读取?整数倍内存读取效率更快

相关文章

  • 结构体

    1.结构体 2.结构体的内存对齐模式 编译器在编译一个结构的时候采用内存对齐模式,结构体总是以最大的成员最为对齐单...

  • ndk-基础知识

    数组和指针,数组指针,指针数组 结构体 内存对齐 内存对齐 结构体大小 S5DUD10BN083MHEJEX7TP...

  • 内存对齐详解

    1、什么是内存对齐假设我们声明两个变量: 2、结构体内存对齐规则 结构体所占用的内存与其成员在结构体中的声明顺序有...

  • iOS原理探索02-- 内存对齐

    结构体内存对齐 我们首先定义两个结构体,分别计算他们的内存大小,并讨论内存对齐原理 从两个结构体来看两者没啥大的区...

  • iOS 内存对齐

    一、结构体内存对齐 1.1 结构体内存对齐三大原则 数据成员对⻬规则结构体(struct)或联合体(union)的...

  • 从结构体内存对齐到OC对象内存对齐

    1、结构体内存对齐 结构体对齐规则:1:数据成员对⻬规则:结构(struct)(或联合(union))的数据成员,...

  • iOS 内存对齐:结构体继承和结构体作为另一个结构体成员变量情况

    内存对齐规则就不赘述了,这里讨论下继承和结构体作为另一个结构体成员变量的情况下,结构体内如何进行内存对齐。以下测试...

  • 结构体

    结构体有名定义 无名定义 结构体嵌套定义 结构体内存对齐 结构体成员初始化 结构体变量引用 结构体的有名定义:直白...

  • 第一天,内存对齐

    一对齐规则: 1.非结构体类型 32位 4字节对齐,64位 8字节对齐 2.结构体类型 以结构体中,最大内存的整数...

  • iOS 结构体内存对齐浅析

    什么是内存对齐 内存对齐是一种在计算机内存中排列数据、访问数据的一种方式。它包含基本数据对齐和结构体数据对齐 。 ...

网友评论

      本文标题:结构体内存对齐

      本文链接:https://www.haomeiwen.com/subject/oyyaertx.html