http://blog.csdn.net/cyousui/article/details/17655051
说明:转载的这篇文章是我看到的觉得解释的比较清楚的一篇文章,网上很多写关于内存对齐的文章,要么说不清楚,要么还有错误,误导别人!!
个人总结如下(我的理解,不一定正确,欢迎指正!):
1.32位机一般默认4字节对齐(32位机机器字长4字节),64位机一般默认8字节对齐(64位机机器字长8字节),数据字节对齐后在内存中的分布与多少位的机器是无关的。
也即,在32位机器上4字节对齐的内存分布与64位机器上4字节对齐的内存分布应该是一样的。
2.当然我们可以通过#pragma pack(n)指定以n字节对齐。由此可以联想,如过32位机上我设置为8字节对齐的话,其实和设置为4字节在内存上没有什么区别。但是如果在64位机上设置4字节对齐的话,对于8字节的变量(比如double类型)是有可能会造成需要2个cpu指令周期才能读完的。比如:
struct test
{
char a;
double b;
int c;
}
如果我设置为4字节对齐,那么内存分布应该是(以x代表填充的字节,括号类的数字代表地址,默认0为首地址),a(0)xxxb(4)c(12),sizeof (test)为16.这样的话,64位机访问b这个变量(地址1~11)的时候,得做两次操作,第一次读取0~8地址的数据,第二次读出9~16地址的数据。
所以,我们设置的对齐字节不应该低于机器的机器字长!!
----------------------------------------------------------------------------------------下面是转载部分----------------------------------------------------------------------------------------------------------
首先我们先看看下面的C语言的结构体:
typedef struct MemAlign
{
int a;
char b[3];
i