C++ 生命周期

  C++程序的生命周期要经过编码(Coding)、预处理(Pre-processing)、编译(Compiling)和运行(Running)四个阶段。

  • 编码即coding阶段,这阶段主要是定义变量,写语句,实现各种数据结构、函数和类。
  • 预处理是 C/C++ 程序独有的阶段,在这个阶段,预处理器(Pre-processor)将编码阶段产生的源码文件进行预处理 。“预处理”的功能是通过各种预处理指令,例如#include、#define、#if 等进行文字替换。
  • 编译阶段,更准确地说,应该是“编译”和“链接”。
    • 在编译阶段,预处理后的源码需要经过编译器和链接器,生成可以在计算机上运行的二进制机器码。在这个阶段,C++ 编译器要分词、语法解析、生成目标码,并尽可能地去优化。
    • 在编译的过程中,编译器还会根据c++语言规则检查程序的语法、语义是否正确,发现错误就会导致编译失败,这就是cpp的“静态检查”。
    • 在处理源码的时候,编译器会根据cpp语法检查各种类型、函数的定义,所以在这个阶段,可以以编译器为目标进行编程,有目标的控制编译器的行为,这即“模板元编程”。
  • 运行阶段即可以得到最终的结果,在这个阶段,可以做 GDB 调试、日志追踪、性能分析等以优化代码。

  C++的编译又可以细化为编译和链接,链接又分为静态链接、加载时的动态链接与运行时的动态链接。编译阶段只会对每个源代码分开编译,对于只有声明没有定义的函数,编译器会将其编译为一个符号,并期望在链接阶段找到这个函数的定义。对于一个只有声明没有定义的函数,如下所示,可以发现其会在链接阶段出错。

        链接时,主要是链接函数和全局变量。无论是哪种链接方式,其最终都会生成可执行文件,只不过链接的时机不同。静态链接与动态链接的区别可以参考,简单来说,静态链接要比动态链接性能好,但是其会由于链接同样的模块而浪费内存,同时若使用动态链接,某个模块更改后,只需要重新编译这一模块即可,但是静态链接是需要全部编译的。

Linux 为什么要动态链接?与静态链接的区别是什么?

     编译和链接的区别可以参考如下链接,之所以把编译和链接分开,是因为当使用动态链接时,我们可以单独编译某个模块,然后可以再用链接器链接其他的模块,通过这种方式,如果只修改某个模块,在编译时只需要编译此模块即可,并不需要编译整个模块,当需要最终的可执行程序时,可以将所有模块共同编译。

The difference between compiling and linking - Birost

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值