#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/