1. 程序编译过程
- 编译预处理:处理以#开头的指令;
- 编译优化:将源码的.cpp文件翻译成.s汇编代码;
- 汇编:将汇编代码.s翻译成机器指令.o文件;
- 链接:将一个或多个库和目标文件链接到一块,生成可执行程序。
链接分为两种:
- 静态链接:代码从其所在的静态链接库中拷贝到最终的可执行程序,在该程序被执行时,这些代码会被装入到该进程的虚拟地址空间中。
- 动态链接:代码被放到动态链接库或共享对象的某个目标文件中,链接程序只是在最终的可执行程序中记录了共享对象的名字等一些信息。在程序执行时,动态链接库的全部内容会被映射到运行时相应进行的虚拟地址的空间。
两种链接的优缺点:
- 静态链接:浪费空间,更新困难 优点是执行的时候运行速度快;
- 动态链接:相比静态链接会有一定的性能损失 优点是节省空间、更新方便;
2. 内存管理
C++ 内存分区:栈、堆、全局/静态存储区、常量存储区、代码区。
- 栈:存放函数的局部变量、函数参数、返回地址等,由编译器自动分配和释放。
- 堆:动态申请的内存空间,就是由malloc分配的内存块,由程序员控制它的分配和释放,如果程序执行结束还没有释放,操作系统会自动回收。
- 全局区/静态存储区:存放全局变量和静态变量,程序运行结束操作系统自动释放。
- 常量存储区(.data 段):存放的是常量,不允许修改,程序运行结束自动释放。
- 代码区(.text 段):存放代码,不允许修改,但可以执行。编译后的二进制文件存放在这里。
3.栈和堆的区别
- 申请方式:栈是系统自动分配,堆是程序员主动申请。
- 申请后系统响应:分配栈空间,如果剩余空间大于申请空间则分配成功,否则分配失败栈溢出;申请堆空间,堆在内存中呈现的方式类似于链表(空闲内存映射表),在链表上寻找第一个大于申请空间的节点分配给程序,将该节点从链表中删除,大多数系统中该块空间的首地址存放的是本次分配空间的大小,便于释放,将该块空间上的剩余空间再次连接在空闲链表上。
- 栈在内存中是连续的一块空间(向低地址扩展) 最大容量是系统预定好的,堆在内存中的空间(向高地址扩展)是不连续的。
- 申请效率:栈是有系统自动分配,申请效率高,但程序员无法控制;堆是由程序员主动申请,效率低,使用起来方便但是容易产生碎片。
- 存放的内容:栈中存放的是局部变量,函数的参数;堆中存放的内容由程序员控制。
4.变量的区别
变量的四大类型:全局变量,静态全局变量,局部变量,静态局部变量。
全局变量:全局作用域,一个文件中定义,同属于一个程序的其他文件之中使用extern声明后也可使用。
静态全局变量:文件作用域,不同文件之间不共享。
局部变量:局部作用域,函数体执行完被销毁,存放在栈区。
静态局部变量:局部作用域,程序执行结束后被销毁。
除了局部变量存放在栈区外,其他变量全都存在静态存储区。
作用域可分为 6 种:全局,局部,语句,类,命名空间和文件。