美文网首页
内存对齐

内存对齐

作者: redye | 来源:发表于2019-12-22 21:54 被阅读0次

内存对齐,或者说字节对齐,是代码编译后在内存的布局与使用方式。现代计算机一般是32比特或64比特地址对齐,如果要访问的变量没有对齐,可能会触发总线错误。参考维基百科

什么是内存对齐

即某个地址A满足是n的倍数,其中n是2的幂次方(如1、2、4、8等等)。如果用二进制表示的话,那么 A的末尾至少有log2n个0。当我们说到某个变量是n字节对齐的时候,其意思是指这个变量的地址是对齐的。

内存对齐的意义

从我们编写的程序来看,CPU好像可以访问内存中的任意位置;但是实际上CPU往往是按照块为基本单位访问内存的。如果某个变量的起始地址位于某个块的的起始处,则只需较少的次数便能完成读取。 比如在某个CPU中,其每次取内存的大小为8字节,对于一个8字节的long类型变量,如果该变量的地址是8的倍数,那么每次load这个long变量只需要一次操作。如果不是8的倍数则需要两次,影响效率。

内存对齐的原则

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

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

  • 结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补⻬。

内存对齐的例子

我们以 64 位架构,即 8 字节对齐:

struct {
    char a;     // 1 byte   offset = 0x00  0x00~0x07 8字节
    double b;   // 8 bytes  地址为8的倍数 offset = 0x08 0x08~0x0f 8字节
    short c;    // 2 bytes  地址为2的倍数 offset = 0x10 0x10~0x11 2字节
    char d;     // 1 byte   地址为1的倍数 offset = 0x12 0x12 1字节
} x; // 地址为8的倍数,0x00~0x17

struct {
    double b;   // 8 bytes  0x00~0x07
    char a;     // 1 byte   0x08
    char d;     // 1 byte   0x09
    short c;    // 2 bytes  0x0a~0x0b
} y;  // 0x00~0x0f

NSLog(@"%lu - %lu", sizeof(x), sizeof(y)); //24 - 16

为什么两次输出的结果不一样的原因就是内存对齐的存在。

如果不考虑内存对齐,那么两次输出的就都应该是 12。

结构体的大小受其成员变量分布的影响。

address-align.png

相关文章

  • 2.iOS底层学习之内存对齐

    学习了内存对齐之后的疑问?? 1.为啥要内存对齐?2.内存对齐的规则?3.内存对齐实例分析。 内存对齐的目的 上网...

  • 内存对齐

    本次主要讨论三个问题: 什么是内存对齐 内存对齐的好处 如何对齐 内存对齐 内存对齐是一种提高内存访问速度的策略。...

  • 结构体内存对齐

    对象内存对齐 探讨的问题 1.什么是内存对齐?2.为什么要做内存对齐?3.结构体内存对齐规则4.源码内存对齐算法 ...

  • 内存对齐

    内存对齐 什么叫内存对齐内存对齐就是按照特定的规则对数据进行存储,一般编译器按照8字节对齐标准处理。内存对齐一般用...

  • iOS内存对齐

    这篇文章我们来探索一下iOS内存对齐的原理,在探索完内存对齐原理之后,你就会明白内存对齐的好处。 在讲述内存对齐时...

  • iOS 开发 内存对齐(练习)

    目录 内存对齐规则 对齐系数 面试题演练 一、内存对齐规则 (关于面试题中结构体内存对齐计算总结) 1.1、数据成...

  • 内存对齐

    在C语言柔性数组一文中,提到了内存对齐,于是想写篇文章总结总结内存对齐。 内存对齐 为什么需要内存对齐 计算机系统...

  • iOS底层探究 - 内存对齐

    目录1:内存对齐的原因2:内存对齐的规则3:结构体内存分配演练以及在iOS中对象成员的内存分配探索 一 :内存对齐...

  • 内存对齐

    知识点概要 OC对象内存对齐结构体内存对齐 OC对象内存对齐 计算内存大小的三种方式 1.sizeof:系统提供的...

  • C/C++内存对齐

    在面试或工作中,经常会遇到内存对齐的问题。这里结合我的理解谈一谈对内存对齐的理解。 1. 为什么要内存对齐,不对齐...

网友评论

      本文标题:内存对齐

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