现在的位置: 首页 > 综合 > 正文

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

2013年06月01日 ⁄ 综合 ⁄ 共 845字 ⁄ 字号 评论关闭
#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

抱歉!评论已关闭.