C++编译过程
- 预处理
展开所有宏定义,没有条件编译指令,删除特殊符号 - 编译
将预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后,产生相应的汇编代码文件。 - 汇编
将编译完的汇编代码文件翻译成机器指令,并生成可重定位目标程序的.o文件,该文件为二进制文件,字节编码是机器指令。 - 链接
通过链接器将一个个目标文件(或许还会有库文件)链接在一起生成一个完整的可执行程序。
将生成的.obj文件与库文件.lib等文件链接,生成可执行文件(.exe文件)
例如,某个源文件中的函数可能引用了另一个源文件中定义的某个符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数,等等。所有的这些问题,都需要经链接程序的处理方能得以解决。
链接程序的主要工作就是将有关的目标文件彼此相连接,也就是将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体。
条件编译作用
选择运行环境、省去某些模块的编译、防止重复定义
局部变量 全局变量
全局变量的生存期从进程创建开始,一直到进程运行完毕,所有内存被操作系统回收位置为止。
局部变量的生存期,是从函数创建它开始,到函数调用完毕,被操作系统回收这一段时间。
全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间。
存储在静态数据区的变量会在程序刚开始运行时就完成初始化
进程创建和main函数调用是两个概念,进程创建包括代码加载、数据加载、内存空间分配过程,是操作系统完成的,而main函数是进程调用的
静态局部变量
放在数据段中的,只初始化一次,下次调用这个函数时,保留原来的值,继续使用。
静态全局变量、静态函数
本来全局变量其他文件也可以访问(在当前文件中使用extern来声明其它文件中定义的全局变量),函数其他文件也可以调用,为了将作用域限制在该文件内。
静态/全局变量初始化时间
- c中:
在C中,静态变量,即全局变量和static变量,是在程序运行前创建的,其中已初始化的全局变量和static变量在编译汇编成目标文件时,初始值就已经保存在磁盘的.data段了,进程加载时将其映射到内存空间即可;
未初始化的全局变量需要进程加载时真正的为.bss段分配内存空间,并赋值为0。静态变量的创建和初始化都是在运行前完成的,切记C中不能动态初始化。 - c++中:
- c++内部定义的数据结构: 静态初始化 汇编时初始化
- 全局或局部静态对象 :C++中由于引入对象,对象生成必须调用构造函数,因此C++规定当且仅当对象首次用到时进行构造。在main函数执行前由运行时库调用对应的代码进行初始化。
静态成员
静态常量成员可以在类内初始化,静态成员只能在类外初始化
stl
主要分为容器、迭代器、算法和其他组件
容器分为序列式容器(vector list dequeue)、适配器容器(queue stack priority_queue)和关联容器(map set multi_map multi_set pair auto_ptr)
关联容器
底层是红黑树实现的,增删操作的复杂度lg2n,是基于指针操作的,不涉及到内存的修改,所以iterator不失效。
智能指针
将一个用new开辟内存的指针赋给auto_ptr,会自动回收空间