从“微观”角度学习高级语言,让开发者更懂技术细节。

举报
冰释流水 发表于 2021/08/18 18:03:00 2021/08/18
【摘要】 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。