gcc编译 结构体字节对齐

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空间 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值