首先,g++在编译源代码时,会经历下面几个阶段
-E 首先进行预处理,还是源代码格式.i
-S 编译器生成汇编语言.s
-c 汇编器生成二进制文件.o
- 链接库文件,其他代码.out
一.预处理
预处理主要是
1.将#宏定义进行展开,
2.将头文件内容替换
3.去掉注释
二. 编译
编译主要是将预处理后的代码转换成汇编语言:
1.对代码进行语法分析,检查语法错误,
constexpr 声明的变量必须是在编译期计算得到,因而并不是所有的类型都能加 constexpr 声明的。能被 constexpr 声明的类型通常是“字面值类型”(literal type)。“字面值类型” 包括算术类型、引用、指针等,并且constexpr 声明的指针只能被赋值为 nullptr 或 0,或存储于某个固定地址的对象。这里“存储于某个固定地域的对象” 是指全局变量或静态局部变量
2.编译期分配内存
malloc分配内存指定分配大小,静态变量也在编译期间分配,指针在栈上分配
int a=100;编译期确定
内联在编译期。
sizeof编译期
if constexpr()
三.汇编
汇编主要是将汇编语言转化成二进制代码
四.链接
五.载入
六.运行
分配动态内存,即运行起来才分配,比如new,它的大小是不确定的,所以需要运行期间创建。
虚函数多态在运行期确定
模板也在运行期确定
int x=i;运行期;