首页 > 其他 > 详细

内存对齐总结

时间:2014-12-15 21:45:27      阅读:279      评论:0      收藏:0      [点我收藏+]

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

内存对齐对于大部分的软件工程师来说都可以说是透明的,内存对齐应该是编译器去管理的,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;
}
bubuko.com,布布扣
通过结果我们可以看到首先b放在了offset为0的地方,接下来a为long long型,占8个字节,预编译设置的为4字节,所以b后面会预留3个字节,以此类推,最后又添加了3个字节,是为了满足圆整性的要求。

内存对齐总结

原文:http://blog.csdn.net/daida2008/article/details/41949715

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!