目录
我们先来模拟一个场景,这里我们定义一个结构体类型,再定义一个结构变量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.
性能原因
:
数据结构(
尤其是栈
)
应该尽可能地在自然边界上对齐。 原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。这里归根结底的来说就是以
空间换时间
。
看到这里如果觉得有用不如点个赞再走吧!!!
![](https://i-blog.csdnimg.cn/blog_migrate/c6721bae00de3c6537e121343bb9b7b9.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/5640b5218d791166288a643e03fc6919.jpeg)