平平安安 发表于 2015-12-29 16:49:39

关于结构体大小问题(本人个人见解,不对请朋友指正)

关于结构体的大小问题。
在定义变量时,编译器会首先检查变量的长度,而后将变量存到他的倍数的数据地址。
定义结构体时,会首先检查第一个成员的长度,然后将他存到他的倍数的数据地址。
然后存储第二个成员时要检查存储完第一个数据后的地址是不是第二个成员长度的倍数
如果是,就接着存储,如果不是,会开始在这个地址上补,补到是第二个成员的长度的
倍数时在存储第二个成员。

比如
struct Arr

        char a;
        int b;
        double c;
        char s;
        int h;


先检查 char a 大小,为1,。
比如变量存储开始内存为0
第一个成员的大小就是1存储完后第地址是1
第二个成员大小是   4
1不是4的倍数,所以会在后面补位,补到是4的倍数位置,1+1+1+1=4;
4是4的倍数,所以第二个成员会从4开始存储   4+4=8
第三个成员大小是8
8是8的倍数,所以不用补位,直接存储 8+8=16
后面的两个字节由于都比double小,所以都会按照8来存储16+8+8=32

注:如果后面两个按照它本身的大小的倍数存,就不能满足都double的倍数了。


结构体会先检查前面成员的大小,然后按照他的倍数的地址开始存储,不是倍数的
会在后面补字节,直到是他的倍数在开始存储,而后面大字节的成员不会影响
前面小字节的成员的存储大小,只会在存储地址不是倍数时补位,会覆盖他后面所有比他小的成员的存储大小
,让他们按照自己的大小来存储。

泳爸 发表于 2016-7-20 15:21:30

我算出来该结构体大小24,编译器也显示24,不知楼主是否和我一样?另附算法教程http://blog.csdn.net/csw_100/article/details/5495309

Krant5 发表于 2016-7-20 17:58:54

本帖最后由 Krant5 于 2016-7-20 18:06 编辑

这是字节对齐的问题,应该是四个字节对齐的,我觉得应该是24,可能也跟编译器有关系
页: [1]
查看完整版本: 关于结构体大小问题(本人个人见解,不对请朋友指正)