gcc的编译流程:
第一步:预处理---》将C源文件编译成C文件
头文件展开,注释去掉,宏替换掉,不做语法检查
gcc -E test.c -o test.i
第二步:编译--》将预处理之后C文件编译成汇编文件
gcc -S test.i -o test.s
第三步:汇编---》将汇编文件编译生成机器文件
gcc -c test.s -o test.o
第四步:链接---》将所有的机器文件共同参与链接,生成一个可执行文件
gcc *.o -o App
结构体的字节对齐
申请结构体空间,会遵循字节对齐
字节对齐必须式基本的数据类型
要点1:
在32OS:系统最多一次性开辟4个字节
怎样确定每一次开辟空间的大小,依赖于成员中占据字节空间最大的那个数据类型,将其作为基准,来进行每一次空间大小的开辟,但是成员有超过上限4字节的数据类型,此时仍按照4字节进行开辟空间。反之,则按照那个最大的类型占据的字节数进行开辟。
在64OS:系统最多一次性开辟8个字节
怎样确定每一次开辟空间的大小,依赖于成员中占据字节空间最大的那个数据类型,将其作为基准,来进行每一次空间大小的开辟,但是成员有超过上限8字节的数据类型,此时仍按照8字节进行开辟空间。反之,则按照那个最大的类型占据的字节数进行开辟。
要点2:
不管是32OS还是64OS,在存储成员时,均需要保证存储的地址编号和该成员自身的数据类型大小成整数倍的关系,否则往后寻找下一个合适的地址空间进行存储。
验证存储结构体成员时,会考虑到地主编号和成员数据类型大小成整数倍的关系
案例1:
typedef struct AA
{
int a;
char b;
short c;
}Type;
printf(“sizeof(Type) = %\n”,sizeof(Type));
案例2:
typedef struct AA
{
char b;
int a;
short c;
}Type;
printf(“sizeof(Type) = %\n”,sizeof(Type));
第一片空间放完b空间 不够放int型 所以新开辟4字节用来存放a 刚好用完 所以c2个字节所以需要再新开空间最大的数据类型int4字节
因为基本数据类型为int型 4字节所以每次开辟空间为4字节 str char型按照4个字节开辟最少需要7个4字节空间 又因为a占4个字节 b也2个字节也需要开辟空间 占4个空间 一共需要28+4+4=36个字节
因为testB是一个共用体占32空间