C中的struct,union,Bit Filed以及内存对齐

文章目录

介绍

之前我们在这篇文章中提到了如何判断计算机的大小端,里面涉及到了union,这篇文章仔细讲一下这三种结构体的区别。

我的实验平台是x86_64的Ubuntu
C中的struct,union,Bit Filed以及内存对齐

struct

这是我们平时用的最多的结构体了,随手写出一个结构体

#include<stdio.h>
struct{
	char a;
}s;
int main()
{
	printf("%lu\n",sizeof(s));
	return 0;
}

这里由于sizeof的返回值是unsigned long,所以格式要写成%lu
运行结果:
C中的struct,union,Bit Filed以及内存对齐
跟我们想的一样,是一个字节
下面再扩展一下上面的代码

#include<stdio.h>
struct{
	char a;
	short b;
	int c;
	char d;
}s;
int main()
{
	printf("%lu\n",sizeof(s));
	return 0;
}

注意到char ,short, int ,char ,按照上面的图片中的所占的字节数计算,可以猜测该结构体总共占8个字节
运行结果:
C中的struct,union,Bit Filed以及内存对齐
这里的s占了12个字节,比之前计算的8个字节还多出4个字节,怎么回事?
这里就要涉及到字节对齐的知识了。

字节对齐

C是和底层很贴近的语言,C和汇编,和计算机结构有着密切的联系,我们平常写的源代码,编译器会对它做很多工作,从而让计算机能够更快的运行程序。
为了更方便的研究,我们先改动一下源代码
C中的struct,union,Bit Filed以及内存对齐
使用$gcc -g test.c编译,一定要加上-g选项,不然后面的汇编代码看不出原来的c代码是怎么样的。
使用$objdump -dS a.out查看反汇编的结果
与main有关的汇编代码如下
C中的struct,union,Bit Filed以及内存对齐
注意到这四条语句对应的汇编代码,其中右边的-0xc,-0xa…分别是这些数据存放的位置
C中的struct,union,Bit Filed以及内存对齐
我们可以画一幅图来分析内存布局,凑合着看吧这张图。。。

上一篇:差集交集


下一篇:反射获取私有属性