C语言结构体在内存中的存储情况探究------内存对齐
条件(先看一下各个基本类型都占几个字节):
void size_(){ printf("char类型:%d\n", sizeof(char)); printf("int类型:%d\n", sizeof(int)); printf("float类型:%d\n", sizeof(float)); printf("double类型:%d\n", sizeof(double)); return; }
结果:
先来一下, 这个结构体在内存中占有多少个字节的内存呢?
typedef struct mystruct{ /*结构1*/ int i_int; char c_char; char s_char[9]; }MYSTRUCT;
这个呢(交换数据成员顺序)?
typedef struct mystruct{ /*结构体2*/ char c_char; int i_int; char s_char[9]; }MYSTRUCT;
现在让它自己告诉我们
int main() { MYSTRUCT my_st = {0}; int size_struct = sizeof(my_st); printf("%d\n", (int)&my_st.i_int); printf("%d\n", (int)&my_st.c_char); printf("%d\n", (int)my_st.s_char); printf("占用内存大小:%d 个字节\n", size_struct); return 0; }
首先看结构体1的结果
可以看出:int占有4个字节, char占有了1个字节, 那么后面char类型的数组占有了11个字节
这是什么鬼?明明定义了char数组长度为9为什么会是11
别着急继续向下看
查看结构体2的结果(难道不是16?)
哈哈, 竟然又出来个20
揭晓答案:
这是因为结构体的存储存在内存对齐机制,也就是 < 结构体大小能被最宽基本类型成员大小所整除 >
基本类型指的是 char int double 等,这样的对齐机制使得寻址更加方便
为什么结构体1占有16个字节:
因为单个char成员会与其下面的char类型数组组合在一起 也就是相当于一个char类型的长度为10的数组
其中最宽基本类型为 int 占4个字节 而后面的 ”char[10]“数组要满足是int占有4个字节的整数倍最小的就是12, 所以共16个字节
为什么结构体2占有20个字节:
第一个成员为char单个字符, 其后面是一个int类型,不能结合故要给char分配4个字节
后面的char数组当然还要分配12个字节, 所以4+4+12=20个字节
了解了对齐机制后再来分析一个
typedef struct mystruct{ /*结构体3*/ char c_char; double d_double; int i_int; char s_char[9]; }MYSTRUCT;
分析:
最宽基本类型是 double 占有8个字节----------------------------------------------------------------8
第一个char占有1个, 但是要补齐为8个字节---------------------------------------------------------8
后面的int占有4个,相当于4个char类型,与char数组结合为 ”char[4+9]“ , 要补齐为16个字节----16
得到结果-------------------------------------------------------------------------------------------32
验证一下
果然就是这样
本节完......