当前位置:首页 > 内存 > 正文

内存对齐是什么意思

  • 内存
  • 2024-05-02 08:08:24
  • 4137

一、内存对齐的规则1.什么是字节对齐,为什么需要字节对齐?
现代计算机中的内存空间是按字节划分的理论上似乎对任何类型的变量的访问都可以从任意地址开始,但实际情况是当你访问时特定类型的变量,它们经常访问特定的内存地址。这就要求不同类型的数据按照一定的规则在空间中排列,而不是一个接一个地排列。
对齐的作用和原因:每个硬件平台处理存储的方式都非常不同。某些平台只能从某些地址访问某些类型的数据。例如,某些架构的CPU在访问未对齐的变量时会遇到错误。在这种架构下编程必须保证字节对齐。在其他平台上可能不会出现这种情况,但最常见的是,如果不遵循适合它的说明,平台需要调整数据存储,这会导致访问效率的损失。例如,某些平台每次读取时都从一致的地址开始。如果在该偶数地址的开头存储一个int类型(假设是32位系统),那么一次读取就可以读出32位。周期,以及它是否存储在奇数地址。从一开始,需要2个读取周期,将两次读取结果的高低字节相加,得到32位数据。显然,阅读效率下降很多。
2.看一下下面的结构:
structMyStruct
{
doubledda1;
chardda;
inttype
};
会是什么在结构MyStruct上使用sizeof的后果?(MyStruct)的大小是多少?也许你想这样问:
sizeof(MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=13
但是当你在VC中测试上述结构体的大小时,你会发现sizeof(MyStruct)是16。你知道为什么在VC中会得到这样的结果吗?
其实这是VC对变量存储的特殊处理。为了提高CPU的存储速度,VC会“调整”一些变量的起始地址。默认情况下,VC规定每个成员变量的起始地址相对于结构体起始地址的偏移量必须是该变量类型占用的字节数的倍数。下面列出了常见的调整类型(vc6.0,32位系统)。
类型
对齐方式(变量存储起始地址相对于结构体起始地址的偏移量)
Char
偏移量必须为sizeof(char),即1
int的倍数
偏移量必须是sizeof(int),它是4的倍数
float
偏移量必须是sizeof(float),它是4的倍数4
double
偏移量必须是sizeof(double),是8的倍数
Short
偏移量必须是sizeof(short),是2的倍数
各个成员变量存储在按照它们在结构体中出现的顺序依次申请空间,并按照上面的调整调整位置时,空闲字节VC会自动填充。同时,为了保证结构体的大小是结构体字节边界数(即结构体中占用空间最大的类型所占用的字节数)的倍数,VC会自动填充在空字节中。


二、什么是存储字对齐?采用字对齐有何意义

存储字对齐:

1.现代计算机中的内存空间是按字节划分的。从理论上讲,似乎对任何类型的变量的访问都可以从任何地址开始,但实际情况是在访问特定变量时,往往是在特定的内存地址进行访问。这就要求各类数据按照一定的规则在空间中排列,而不是按顺序依次排列。这就是对齐。

2.对齐是内存中存储数据的规则。在32位系统中,一般有字节对齐(8bit)、半字对齐(16bit)、字对齐(32bit)三种方式。它们分别对齐。为连续地址,偶数地址,能被4整除的地址。

使用字对齐的意义:

1.每个硬件平台处理存储空间的方式都有很大不同。

2.某些平台只能从某些地址访问某些类型的数据。在其他平台上可能不会出现这种情况,但最常见的是,如果数据存储没有按照适合平台的要求对齐,就会造成访问效率的损失。

3.某些平台从偶数地址开始每次读取。如果一个int类型(假设是32位)存放在偶数地址开头,那么1个读周期就可以读出,而如果存放在奇数地址开头,可能需要2次读取循环并将两次读取结果的高低字节拼凑起来,得到int数据。显然阅读效率下降很多。这也是一个空间和时间的游戏。