本文共 646 字,大约阅读时间需要 2 分钟。
执行过程
在编译过程中,程序的执行可以分为几个关键阶段:
预处理阶段:这一阶段主要包括宏定义展开、头文件处理以及条件编译。需要注意的是,预处理阶段不会对语法进行检查,这通常是编译阶段的任务。 编译阶段:预处理完成后,编译器会对处理后的源代码进行语法检查,并将其转换为汇编语言文件。 汇编阶段:汇编语言文件会被转换为目标文件(通常是二进制文件)。 链接阶段:目标文件会被链接起来,生成最终的可执行程序。 内存分区
程序在运行时,内存会被划分为不同的区域,这些区域在功能上有明确的区别:
- 代码区:存储程序的代码和常量。
- 数据区:存储全局变量(已初始化和未初始化的)。
- 栈区:用于函数调用的本地存储,属于先进后出的数据结构,由编译器自动管理。
- 堆区:由程序员动态分配和释放,容量通常远大于栈区。
运行前
在程序运行之前,内存的分配情况如下:
-
代码区:
- 共享内存:用于多个进程共享。
- 只读内存:通常用于存放只读数据,如常量。
-
数据区:
- 已初始化的全局变量和静态变量:在程序启动时就被分配了内存。
- 未初始化的全局变量和静态变量:在程序运行时才会被分配内存。
运行后
程序运行后,内存的使用情况会发生变化:
-
栈区:
- 栈是先进后出的数据结构,适合用于函数调用时的本地存储。
- 栈中的变量会在函数结束后自动释放。
-
堆区:
- 堆区的容量远大于栈区,且没有先进后出的特性。
- 堆内存的分配和释放需要程序员主动管理,常见的方法是使用
malloc和free函数。 - 需要注意的是,堆内存如果没有正确释放,可能会导致内存泄漏。
转载地址:http://kaad.baihongyu.com/