C/C++ 编译执行流程/结构体大小计算方法

最近996,没有大块时间学习。

C文件的执行过程

预处理: .C文件 --> .i文件 的过程    命令 gcc -o  hello_world.i hello_world.c -E  生成 预处理文件 由编译器完成

#define  R=3.141592653;

预处理阶段对 宏定义 只是字符串层面的替换,计算机不会考虑语法上的错误

#define MAX(a,b) (a>b?a:b);

宏定义的作用:使用更加灵活,如 MAX(a,b) a,b并未指定参数类型,int,folat等数据类都可以使用 MAX(a,b) 的宏定义

 

预编译: .i 文件 --> .s文件 

此阶段完成语法和语义分析,然后生成中间代码,此中间代码是汇编代码,但是还不可执行,gcc编译的中间文件是[.s]文 件。在此阶段会检查各种语法和语义错误,特别要小心未定义的行为,这往往是致命的错误。由编译器完成

汇编:.s文件 --> .o文件

此阶段主要完成将汇编代码翻译成机器码指令,并将这些指令打包形成可重定位的目标文件,[.O]文件,是二进制文件。此  阶段由汇编器完成

链接:.o 文件 --> 可执行文件

此阶段完成文件中叼用的各种函数跟静态库和动态库的连接,并将它们一起打包合并形成目标文件,即可执行文件。此阶段由链接器完成

 

结构体大小计算方法:

union User{
    int age;
    char sex;
    double weight;
}

//union 共用体 成员共用一块内存,其大小由最大成员所占字节决定 User=8 个字节

struct student{
    long a;//偏移量=0
    int  b;//偏移量=8,当前成员所占字节是4,8是4的整数倍 不需要 填充字节数
    char c;//偏移量=8+4,当前成员所占字节是1,12是1的整数倍 不需要 填充字节数
    float d;//偏移量=8+4+1,当前成员所占字节是4,13不是4的整数倍,16是>13的最小倍数需要在 c,d之间  填充3个字节
}

所以 student = 最后一个成员的偏移量 + 最后一个成员的大小 + 填充数 =13+4+3=20 然后

需要判断  student的字节数是否是其最大成员 a(8个字节) 的整数倍不是的话需要补齐 20%8!=0即还需补4个字节,最后 student的实际大小= 20 +4 = 24个字节

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值