c++内存模型
1、源代码区:存储代码的区域(类似jvm里的方法区) 2、静态区:存储静态变量和全局变量的区域(类似jvm里的方法区里的方法区) 3、栈区:存储局部变量和参数的内存区域,由系统开辟、由系统回收的内存区域 4、堆区:程序员开辟的一块内存区域用来存储对象的区域,由用户开辟和回收的内存区域。 5、常量区(字面值区):存储const常量 指针变量能指向那些区域: 栈区、堆区、静态区、常量区、代码区
堆区和栈区的注意点:
1、栈是向下增长,而堆是向上增长。
2、栈由系统管理,没有内存碎片,每个元素之间都是连续的;堆区存储的是程序员new出来的变量,是动态开辟的。
c++编译过程
- 编译预处理+ 编译、优化阶段+ 汇编+ 链接
链接过程
主要是解决在一个文件中引用了另外的一个文件中变量或函数的问题,它将有关的目标文件彼此相连接,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体。
在《编译原理》中我们可以了解到一个编译器对程序代码的编译主要分为下面几个过程:a) 词法分析 b) 语法分析 c) 语义分析 d) 中间代码生成 e) 代码优化 f) 目标代码生成 g) 符号表管理 h) 将多个步骤组合成趟 i) 编译器构造工具
GCC编译过程
在Linux下使用的gcc编译器将上面几个过程捆绑在一起,简化我们的使用,但是我们依然可以通过指定不同的参数,来分别执行各个过程:
命令(-o后面都是自己指定的文件名字)工作内容gcc -E hello.c -o hello.i预处理gcc -S hello.c -o hello.s编译gcc hello.s -o hello.o汇编gcc hello.o -o hello链接
1.cpp的内容
执行预处理命令后: (文件名是1.cpp)
一步编译运行:
参考文章:
GCC and Make - A Tutorial on how to compile, link and build C/C++ applications