首页 > 代码库 > 内存对齐总结

内存对齐总结

今天参加了入职前的小小的培训,培训中老师讲到了关于内存对齐的只是,以前接触过,但是没有深究,今天老师讲了,回来便查了查资料,下面便是我对内存对齐的理解。

内存对齐对于大部分的软件工程师来说都可以说是透明的,内存对齐应该是编译器去管理的,C语言的特点就是强大灵活,他允许你对内存进行操作。如果你想对深层次的更加底层的东西要加以理解,就必须对内存对齐要有一定的了解。

首先是为什么我们需要对内存对齐:

1)平台的原因:不是所有的平台都能访问任意地址上的任意数据的,某些硬件平台只能访问某些地址处的某些类型的数据,否则就异常;

2)性能的问题:为了访问为对齐的数据,处理器要作两次的内存访问;

对齐的规则:

通常我们都讨论的是结构体的数据在内存中的布局,首先第一个数据放在offset为0的位置上,后面的数据的布局按照数据本身和系统默认的“对齐系数”或者是通过预编译#pragma pack()设置的“对齐系数”中的较小的那个进行。

最后注意下圆整性就好了,也就是说最后结构体占据的内存空间的大小是系统默认“对齐系数”或者预编译设置的“对齐系数”的整数倍即可。

举个例子:

#include <stdio.h>
#pragma pack(4)
struct xx{
	char b;
	long long a;
	int c;
	char d;
};
#pragma pack()

int main()
{
	struct xx x1;
	printf("&a=%p\n",&x1.a);
	printf("&b=%p\n",&x1.b);
	printf("&a=%p\n",&x1.c);
	printf("&b=%p\n",&x1.d);
	printf("%d",sizeof(x1));
	return 0;
}

通过结果我们可以看到首先b放在了offset为0的地方,接下来a为long long型,占8个字节,预编译设置的为4字节,所以b后面会预留3个字节,以此类推,最后又添加了3个字节,是为了满足圆整性的要求。

内存对齐总结