从“微观”角度学习高级语言,让开发者更懂技术细节。
【摘要】 C++作为一门高级语言,拥有比C语言更加丰富的特性,如:面向对象、封装、继承、多态、模板元编程、lamda表达式等等,而且每个三年定期发布新版本新特性,这也让很多c++爱好者中痛苦和着迷,存在太多的技术细节需要我们去学习和掌握。在学习过程中,需要真正掌握底层细节,可以从汇编指令的角度,看看c++底层是如何实现的。话不多说,以话题(对象析构&return执行的顺序,谁先?谁后?)为例,试着从汇...
C++作为一门高级语言,拥有比C语言更加丰富的特性,如:面向对象、封装、继承、多态、模板元编程、lamda表达式等等,而且每个三年定期发布新版本新特性,这也让很多c++爱好者中痛苦和着迷,存在太多的技术细节需要我们去学习和掌握。在学习过程中,需要真正掌握底层细节,可以从汇编指令的角度,看看c++底层是如何实现的。
话不多说,以话题(对象析构&return执行的顺序,谁先?谁后?)为例,试着从汇编角度学习。
代码示例:
#include <iostream>
using namespace std;
int i = 1;
class Base {
public:
~Base() {
i = 10;
}
};
int func() {
i = 2;
Base b;
return i;
}
int main() {
func();
cout << i << endl;
}
此处问题:最终i到底打印出来是什么?
- 编译及反汇编
g++ -g test.cpp
objdump -S a.out
- 汇编学C++
int func() {
40118a: 55 push %rbp
40118b: 48 89 e5 mov %rsp,%rbp
40118e: 53 push %rbx
40118f: 48 83 ec 18 sub $0x18,%rsp
i = 2;
# i地址 0x2ebb(%rip) = 404058,将2存入该地址
401193: c7 05 bb 2e 00 00 02 movl $0x2,0x2ebb(%rip) # 404058 <i>
40119a: 00 00 00
Base b;
return i;
# 将 404058存储的值,暂存至EBX
40119d: 8b 1d b5 2e 00 00 mov 0x2eb5(%rip),%ebx # 404058 <i>
Base b;
# 退栈前,执行对象析构
4011a3: 48 8d 45 ef lea -0x11(%rbp),%rax
4011a7: 48 89 c7 mov %rax,%rdi
4011aa: e8 8b 00 00 00 callq 40123a <_ZN4BaseD1Ev> # Base::~Base()
return i;
# 析构函数调用完成后,将EBX值存入 EAX,退栈。
4011af: 89 d8 mov %ebx,%eax
}
4011b1: 48 83 c4 18 add $0x18,%rsp
4011b5: 5b pop %rbx
4011b6: 5d pop %rbp
4011b7: c3 retq
从汇编来看,优先将i变量中值取出,再执行析构函数,最后退栈。
总结:任何高级的语言,最终都是需要被cpu解析和执行的,也就是最终都会被翻译地原始的低级语言。试着从最细微低级的角度去学习,能帮助开发者更好地掌握语言的本质。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)