C语言结构体在内存中的布局(直接对齐)

时间:2022-08-08 10:33:26
#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/

2. http://blog.csdn.net/hust_wusen/article/details/9492031