欢迎访问我的博客首页。
1. 编程语言
1.1 C++ 与 C
C 是面向过程的语言,C++ 和 Python 都是面向对象的语言。面向过程的语言以过程为中心,与面向对象最大的不同是封装、继承、类。
C++ 支持重载,所以编译后的函数名和定义的函数名不一样。我们可能会在编译错误中看到编译后的函数名 _Z[函数名的字符数][函数名][简写的形参类型],如下。所以代码中经常用 extern “C” 来告诉 C++ 编译器按照 C 语言的命名规则编译源码。
void fac() // _Z3facv
void fun(int, int) // _Z3funii
1.2 C++ 与 Python
- 运行过程。Python 是解释型语言,每次运行时解释器都要逐条读取代码并解释成机器语言再运行。C++ 是编译型语言,需要经过预处理、编译、汇编、链接等过程。
- 跨平台。Python 是跨平台语言,不依赖操作系统和硬件环境。C++ 不支持跨平台。
- Python 有内存回收机制。C++ 的动态内存需要用户显式管理。
2. 编译
- 预处理。执行预处理指令,引入头文件、替换宏定义等。所有的预处理指令都以井号开头,只有空格字符可以出现在预处理指令之前。预处理指令不是 C++ 语句,所以它们不会以分号结尾。
- 编译。编译器把预处理文件编译成汇编语言,汇编语言是一种助记符形式的简洁指令。编译过程会把重载函数、泛型实例化。
- 汇编。汇编语言编译成二进制形式的机器码,产生的文件叫做目标文件。
- 链接。目标文件与其它目标文件、库文件等链接成可执行程序。
以 GCC 编译为例,使用 4 条命令执行这 4 个阶段并生成对应的文件。
gcc -E example.c -o example.i
gcc -S example.i -o example.s
gcc -c example.s -o example.o
gcc example.o -o example
3. 内存
内存区 | 堆区 | 栈区 | 静态存储区 | 文字常量区 | 程序代码区 |
---|---|---|---|---|---|
存放内容 | 局部变量、函数参数 | 全局变量、静态变量 | 字符串常量 | 二进制代码 | |
分配与释放 | 程序员负责分配和释放。 泄露的内存在程序结束时由OS回收。 | 编译器分配和释放。 | 程序结束时由OS回收。 | 程序结束时由OS回收。 |