得到一个有意思的 c++语法分析网站,可以把 c++高级版本的程序展开为 c++11的形式,更方便看到那些高级特性是如何实现的,
另外也提供 cpp-> 汇编代码的功能(那个绿色齿轮open in compiler Explore 按键),比起命令行的显示,提供颜色区分,视觉上更加直观。
详细注释一下 汇编代码的功能,前提知识
栈的生长方向是逆着地址增长方向的,也就是说 栈底地址 > 栈顶地址
rbp, rsp 通常分别用来保存 栈低和栈顶指针的值
edi, eax 通常分别用来表示 入参和返回值
int main() {
char * a = new char('a');
char * b = new char[10];
delete[] b;
delete a;
return 0;
}
main:
push rbp //将调用函数的堆栈基底指针保护起来
mov rbp, rsp // 将原栈顶作为本次栈的基底指针
sub rsp, 16 // 编译器注意到,本次的局部变量为 16字节(两个指针 a, b ),先更新了栈顶指针
mov edi, 1 // 准备 new 的入参
call operator new(unsigned long)
mov BYTE PTR [rax], 97 // 将'a' 的ASCII码97放到 rax 指向的内存, rax的值为上面 new 出的结果
mov QWORD PTR [rbp-8], rax // 把 rax的值拷贝到 rbp-8 的位置,也就是 指针 a的值
mov edi, 10 // 准备 new char 的入参10
call operator new[](unsigned long)
mov QWORD PTR [rbp-16], rax // 将 raw 的值拷贝到 rbp-16的位置,也就是指针 b的值
cmp QWORD PTR [rbp-16], 0 // 比较 b 是否是 0,如果是,直接跳转到L2(说明本次 b == nullptr)
je .L2
mov rax, QWORD PTR [rbp-16] // 为delete 准备入参
mov rdi, rax
call operator delete[](void*)
.L2:
mov rax, QWORD PTR [rbp-8]
test rax, rax // test 按位与,如果为 0返回 true
je .L3 // true 的话直接调到 L3
mov rdi, rax // false的话准备入参
call operator delete(void*) // delete a
.L3:
mov eax, 0 // 准备返回值为 0
leave
ret // return