结构体占用内存在好多地方被提及到,特别是在C语言大型开发项目中,利用指针加偏移量来定义一个新的指针。另外在校招中也经常被提起,这几天刚好有人问,拿出来研究一下。
在讨论结构体内存占用情况之前,先说明一下字节对齐,正是由于有字节对齐,有一些看似占用一样内存的结构体实际占用内存不同。计算机的内存空间是用字节(Byte)划分的,从理论上讲似乎任何类型的变量的访问都可以从任何位置开始,但是这样严重影响到数据存取取的效率,于是在计算中字节按照一定规则在空间中排列,这就是字节对齐。
字节对齐的细节一般与具体编译器有关,但一般而言,满足三个准则:
1.结构体变量的首地址能够被其最宽基本类型成员的大小所整除。
2.结构体每个成员相对于结构体首地址的偏移量是成员本身的整数倍,如果有需要编译器会在成员之间加上填充字节。
3.结构体的总大小为结构体最宽基本类型成员大小的整数倍,如果有需要编译器会在最末成员加上填充字节。
注:这里所有的对齐细节与编译器相关是因为每一个编译器有默认的对齐字节数。
因为我们计算的是结构体占用内存,所以第一条不考虑,计算机自动会完成。关于第二条和第三条,就着例子计算结构体占用内存。
#include <stdio.h>
#include <stdlib.h>
typedef struct S1{
char c1;
char c2;
int