编译与内存

本文探讨了C++与C、Python的区别,强调了C++的面向对象特性、函数重载和内存管理。同时,详细阐述了编译过程的四个阶段:预处理、编译、汇编和链接,并解释了不同内存区域的作用。此外,还对比了C++与Python在运行效率和跨平台能力上的差异。
摘要由CSDN通过智能技术生成

欢迎访问我的博客首页


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


  1. 运行过程。Python 是解释型语言,每次运行时解释器都要逐条读取代码并解释成机器语言再运行。C++ 是编译型语言,需要经过预处理、编译、汇编、链接等过程。
  2. 跨平台。Python 是跨平台语言,不依赖操作系统和硬件环境。C++ 不支持跨平台。
  3. Python 有内存回收机制。C++ 的动态内存需要用户显式管理。

2. 编译


  1. 预处理。执行预处理指令,引入头文件、替换宏定义等。所有的预处理指令都以井号开头,只有空格字符可以出现在预处理指令之前。预处理指令不是 C++ 语句,所以它们不会以分号结尾。
  2. 编译。编译器把预处理文件编译成汇编语言,汇编语言是一种助记符形式的简洁指令。编译过程会把重载函数、泛型实例化。
  3. 汇编。汇编语言编译成二进制形式的机器码,产生的文件叫做目标文件。
  4. 链接。目标文件与其它目标文件、库文件等链接成可执行程序。

  以 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回收。

4. 参考


  1. 编译与优化
  2. 编译过程
  3. GCC查看编译优化的命令
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值