文章目录
介绍
之前我们在这篇文章中提到了如何判断计算机的大小端,里面涉及到了union,这篇文章仔细讲一下这三种结构体的区别。
我的实验平台是x86_64的Ubuntu
struct
这是我们平时用的最多的结构体了,随手写出一个结构体
#include<stdio.h>
struct{
char a;
}s;
int main()
{
printf("%lu\n",sizeof(s));
return 0;
}
这里由于sizeof的返回值是unsigned long,所以格式要写成%lu
运行结果:
跟我们想的一样,是一个字节
下面再扩展一下上面的代码
#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个字节
运行结果:
这里的s占了12个字节,比之前计算的8个字节还多出4个字节,怎么回事?
这里就要涉及到字节对齐的知识了。
字节对齐
C是和底层很贴近的语言,C和汇编,和计算机结构有着密切的联系,我们平常写的源代码,编译器会对它做很多工作,从而让计算机能够更快的运行程序。
为了更方便的研究,我们先改动一下源代码
使用$gcc -g test.c
编译,一定要加上-g选项,不然后面的汇编代码看不出原来的c代码是怎么样的。
使用$objdump -dS a.out
查看反汇编的结果
与main有关的汇编代码如下
注意到这四条语句对应的汇编代码,其中右边的-0xc,-0xa…分别是这些数据存放的位置
我们可以画一幅图来分析内存布局,凑合着看吧这张图。。。