深度刨析为何要内存对齐

        

目录

1.当不进行内存对齐时对变量进行访问        

 2.如果我们采用内存对齐

 3.总结:


我们先来模拟一个场景,这里我们定义一个结构体类型,再定义一个结构变量x。

#include<stdio.h>
struct A
{
    char a;
    int b;
    short c;
}
int main()
{
struct A x;
return 0;
}

1.当不进行内存对齐时对变量进行访问        

        当我们不进行内存对齐的时候,那么结构体中的成员变量的内存就会连续分布,但是我们在访问结构体变量时,是按结构体中成员所占的最大字节数对结构体变量进行读取的。

 

         这里我们按照int类型的大小,一次读取4个字节的内容。当我们要访问结构体成员中int类型变量a时我们就要一次读取四个字节,但是我们每次只能从存储边界开始读取,因为我们的int类型的变量b没有对齐在存储边界,所以这里我们读取时就需要读取两次才可以将变量a从内存中读取出来,而且我们还要对读取出来的内容进行剔除,就是提取出黄色的部分,将其他部分去剔除掉,这样无疑会耗费我们更多的时间。

 (这里我理解的存储边界就是,结构体起始位置是内存内存边界,从起始位置开始,每隔一个最大对齐数的宽度就是一个内存边界)

         那一定有人说你每次只访问一字节不就可以了,那当我们遇到下面这种情况

#include<stdio.h>
struct A
{
    double a;
    int b;
    double c;
}
int main()
{
struct A x;
return 0;
}

 当我们要访问变量中成员变量a时,一个变量要读取八次,无疑这是十分耗费时间的。

 2.如果我们采用内存对齐

再回到最初的代码

#include<stdio.h>
struct A
{
    char a;
    int b;
    short c;
}
int main()
{
struct A x;
return 0;
}

采用内存对齐之后我们可以看到,直接就可以将每个存储的变量直接读取出来,不用进行两次读取。也不用剔除不需要的数据,这极大的节省了时间。

 3.总结:

要内存对齐的原因:

1.平台原因:
        不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能 在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2. 性能原因
        数据结构( 尤其是栈 ) 应该尽可能地在自然边界上对齐。 原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。这里归根结底的来说就是以 空间换时间
看到这里如果觉得有用不如点个赞再走吧!!!

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

月半木斤

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

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

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

打赏作者

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

抵扣说明:

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

余额充值