C语言计算结构体占用的空间大小

嵌入式技术

1337人已加入

描述

1. 问

计算以下两个结构体所占空间大小分别是多少?

struct t1 {
    char a;
    short int b;
    int c;
    char d;
};

struct t2 {
    char a;
    char b;
    short int c;
    int d;
};

2. 答

64 位环境下,sizeof(struct t1) = 12, sizeof(struct t2) = 8

3. why

3.1 原因

为了保证程序的访存效率,各类型变量在内存中的存储位置有所要求。比如,为保证能够一次性获取 int 类型变量的值,int 类型的变量会被存储在 4 的整数倍的地址处。为保证访存效率,结构体中的成员也要满足此类要求,这就是结构体的内存对齐,其有两个整数倍规则:

  1. 结构体的大小是 占用空间最大的成员所占空间大小的****整数倍
  2. 结构体中,成员的偏移量是成员所占空间大小的 整数倍

3.2 解答

对于文章开头问题中的结构体,其真实内容如下, 编译器会向结构体中插入预留位

/*
struct t1 {
    char a;
    short int b;
    int c;
    char d;
};
*/

struct t1 {
    char a;
    char reserved1[1];
    short int b;
    int c;
    char d;
    char reserved2[3];
};

/*
struct t2 {
    char a;
    char b;
    short int c;
    int d;
};
*/

struct t2 {
    char a;
    char b;
    short int c;
    int d;
};

所以,sizeof(struct t1) = 1 + 1 + 2 + 4 + 1 + 3sizeof(struct t2) = 1 + 1 + 2 + 4

4. 再来一个

struct t3 {
    char a;
    char b;
    double c;               
    short int d;
    int e;
};

=

struct t3 {
    char a;
    char b;
    char reserved1[6];
    double c;
    short int d;
    char reserved2[2];
    int e;
};

5. 总结

  1. 计算结构体所占空间大小时记住 两个整数倍
  2. 为了使结构体占用的空间最小,应该将结构体成员按照所占空间大小 从小到大的顺序进行排列
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分