C语言结构体内存空间分配

首先来说如果结构体的内存是按照便捷对齐的话,比如下图的这个结构体:
C语言结构体内存空间分配
假如按照边界对齐要求的话,恐怕需要24个字节的存储空间。而short类型和charl类型却仅仅占了不到一个double八个字节的空间。
C语言结构体内存空间分配图中的彩色部分就是根据边界对齐,这三个类型实际所占的空间,可以说大部分的空间就这样白白浪费了。那么问题来了?既然我可以想到这个问题,在编写这个东西的那些工作人员不可能没有注意到吧?
我于是在vs里面对这个程序进行的测试,看看结构体到底是如何进行内存分配的。
我首先用定义了上图的结构体,然后用是sizeof检查它的大小,结果出乎我的意料
C语言结构体内存空间分配
不是24,于是我去了结构体的首地址,查看了内存的内部的存储情况,
C语言结构体内存空间分配
发现首先起始地址是8或者4的倍数,double占了八个字节(0x0049fdb0~0(ˇˍˇ) 想~9fdb7),short占了两个字节(0x49fdb8~0x49fdb9),char占了一个0x49fdba。这是十一个字节,当仍然有5个字节的浪费。
然后我试着老师启发的把double换到了中间。
C语言结构体内存空间分配
变成了24个字节,难道真的执行了边界对齐吗?
打开内存窗口
C语言结构体内存空间分配
看来是符合边界对齐了,
然后把double 放在第三个,这次是16和第一次的一样。
C语言结构体内存空间分配
short占了2个字节,然后我求出double的起始地址,减去char的结束地址得到的是八,也就是说char分到了6个,但他只用了一个字节。
通过上面的三次测试,
首先结构体的内存分配的起始位置都是4,或者8的倍数,其次结构成员所占的内存空间与其每次的偏移量有关,如果说偏移量能被结构体内最大类型整除,就不需要填充,如果不是就需要填充字节以对齐该成员。