关于内存对齐详细解释
什么是内存对齐?
在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自的空间相加,这里涉及到内存对齐的问题。访问未对齐的内存,处理器需要访问两次(数据先读高位再读低位然后进行拼接),而访问对齐的内存,只需要一次。为了提高效率,所以进行内存对齐。windows的默认对齐数是8,linux中默认对齐数为4.
为什么会产生内存对齐的原因?
1.平台原因:
某些平台只能在特定的地址处访问特定类型的数据。
2.性能原因:
(1)数据结构(尤其是栈)应该尽可能在自然边界上对齐。
(2)为了访问未对齐的内存,处理器需要作两次内存访问;而未对齐的内存仅需要访问一次。
编译器是怎样进行内存对齐的优化的?
在内存中,编译器按照成员列表顺序分别为每个结构体变量成员分配内存,在存储过程中需要满足边界对齐要求时,编译器会在成员之间留下额外的内存空间。
结构体或联合体的数据成员、第一个成员放到0编译地方,以后每个数据成员放到自身对齐的整数倍偏移处。(结构体大小必须是最大对齐数的整数倍)。
字节对齐可以程序控制,采用指令:
#pragma pack(1)//1字节对齐
#pragma pack(2)//2字节对齐
#pragma pack(4)//4字节对齐
#pragma pack(8)//8字节对齐
举个栗子:
struct A{
char c;
double d;
short s;
int i;
}
当系统以8字节对齐时
程序验证一下:
#pragma pack(8)
#include<iostream>
#include<cstdio>
struct A
{
char c;
double d;
short s;
int i;
};
int main()
{
struct A a;
printf("A所占大小为%d字节\n",sizeof(struct A));
return 0;
}