#include <stdio.h>
#define HARVIS
#ifdef HARVIS
#pragma pack(1)
#else
#pragma pack(4)
#endif
struct A{
int a;
char b;
char c;
};
struct B{
char b;
int a;
char c;
};
struct pack {
int i;
short s;
double d;
char c;
short f;
};
int main(int argc, char *argv[])
{
printf("sizeof(struct A) = %d\n", sizeof(struct A));
printf("sizeof(struct B) = %d\n", sizeof(struct B));
printf("sizeof(struct pack) = %d\n", sizeof(struct pack));
getchar();
return 0;
}
简单解读
#pragma pack(1)表示内存按照一字节对齐,此时struct A的内存格局为
+
+
+
+
-
-
此时struct B的内存格局为
-
+
+
+
-
#pragma pack(4)表示内存按照4字节对齐,此时struct A的内存格局为
+ + + +
- - x x
此时struct B的内存格局为
- x x x
+ + + +
- x x x
其中-表示一个char,4个+表示一个int,x表示填充的内存空间(没有用到)
面试的时候经常问到这个问题, CPU寻址按字节对齐后的效果更快, 比如arm处理器要求4字节对齐, 地址为4的整数倍, 取4个字节的内容, 一次寻址操作即可完成.
如果地址为4的整数倍加1的话, 要经过两次寻址, 一次去3个字节, 一次取1个字节. 道理是这样的. 一般情况字节对齐和cpu的位宽保持一致.
【参考】
1. http://chenuaizhang2008.blog.163.com/blog/static/7276357201192542016205/