图文并茂从汇编层理解Cthis指针实现原理

https://m.toutiao.com/is/JTLB9W7/

当我们在C++中定义一个类时,编译器会把C++代码编译成汇编,但汇编中并没有类、类成员函数、类成员变量等概念,那在汇编层是如何来处理类的呢?


下面我们来看个简单例子:

class TestClass{public: int Sum() { return m_a+m_b; }public: int m_a; int m_b;};int main(){ TestClass testClassObj; testClassObj.m_a = 5; testClassObj.m_b = 6; int result = testClassObj.Sum(); return 0;}

编译器会把上面的代码生成,语义类似下面的C代码

struct TestClass{    int m_a;    int m_b;};INT TestClass_Sum(TestClass* this){    return this->m_a +  this->m_b; }int main(){    TestClass testClassObj;    testClassObj.m_a = 5;    testClassObj.m_b = 6;    int result = TestClass_Sum(&testClassObj);    return 0;}

虽然C++中TestClass类把成员变量与成员函数写在了一起,但经过编译器处理后,本质上还是分开的,编译器会为成员函数(Sum函数)添加一个形参(this指针),通过这个this变量就能访问类对象里的成员变量。

下面来看下C++的类成员函数Sum是不是多了个形参this指针,且this指针指向对象本身:

我们前面详细分析过,函数的局部变量保存在栈上

(1)testClassObj是main函数的局部变量,所以testClassObj保存在函数的栈上,而m_a是testClassObj对象的第一个局部变量,所以m_a的地址等于testClassObj对象的地址,

movl $0x5,-0x10(%rbp) 等价于 m_a=5;

movl $0x6,-0xc(%rbp) 等价于 m_b=5;

从而可知testClassObj的地址为-0x10(%rbp),从图中

可知,testClassObj的地址,最后被传到了sum函数的栈上,保存的地址为$rbp-0x8,但Sum()函数的定义里是没有带形参的,所以这个新传入的对象就是编译器给我们加上的this指针,指向对象本身。这样就从汇编层证实了,编译器确实给类的成员函数添加了一个形参this指针。

(0)

相关推荐

  • 站在C语言的肩膀上学汇编(2):栈

    懒人利器2021-01-18 21:01:12 C语言函数的局部变量保存在栈上; C语言函数的调用信息保存在调用栈上; C语言可以利用栈溢出攻击: C语言中很多概念都跟运行时栈相关,但它对C层是透明的 ...

  • Go函数闭包底层实现(误删,重发)

    原创 机器铃砍菜刀 Golang技术分享 前天函数闭包对于大多数读者而言并不是什么高级词汇,那什么是闭包呢?这里摘自Wiki上的定义: a closure is a record storing a ...

  • 二次控制原理图如何识图与绘制?图文并茂让你瞬间理解!

    很多电气的朋友问:二次原理图和二次控制回路是一样的吗?其实所谓的二次原理图是指对主回路(一次系统设备)的控制.指示.计量用的原理图.二次原理图包括了二次控制回路图.如CT的二次回路图也是二次原理图,但 ...

  • 二次控制原理图如何识图与绘制?这篇文章图文并茂令你瞬间理解!

    很多电气的朋友问:二次原理图和二次控制回路是一样的吗?其实所谓的二次原理图是指对主回路(一次系统设备)的控制.指示.计量用的原理图.二次原理图包括了二次控制回路图.如CT的二次回路图也是二次原理图,但 ...

  • 通过十个问题助你彻底理解linux epoll工作原理

    linux服务器开发相关视频解析: linux下的epoll实战揭秘--支撑亿级IO的底层基石 epoll的网络模型,从redis,memcached到nginx,一起搞定 epoll 是 linux ...

  • 一文理解 Transformer 的工作原理

    概  述 自然语言处理中的 Transformer 模型真正改变了我们处理文本数据的方式. Transformer 是最近自然语言处理发展的幕后推手,包括 Google 的 BERT. 了解 Tran ...

  • 列举几个简单的例子来更好的理解scrapy工作的原理

    说明:了解爬虫的可能都会知道,在爬虫里,requests入门简单,即使是没有基础的小白,学个几天也能简单的去请求网站,但是scrapy就相对来说就比较难,本片文章能是列举几个简单的例子去理解的scra ...

  • 收藏 | 如何理解PCA的数学原理

    仅做学术分享,如有侵权,联系删除转载于 :算法数学俱乐部,算法与数学之美 编辑:nhyilin 数据的向量表示及降维问题 一般情况下,在数据挖掘和机器学习中,数据被表示为向量.例如某个淘宝店2012年 ...

  • C 11中智能指针的原理、使用、实现

    目录 理解智能指针的原理 智能指针的使用 智能指针的设计和实现 1.智能指针的作用 C 程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理.程序员自己管理堆内存可以提高了程序的 ...

  • 6分钟教你彻底理解三原色的色彩原理,轻松模仿各路大神作品色调

    6分钟教你彻底理解三原色的色彩原理,轻松模仿各路大神作品色调 相信大家和我一样,在学习后期部分枯燥内容的时候心情十分低落,一点兴趣都没有.但是呢,虽然工具原理枯燥无味,但是仍然要咬牙坚持去学习,直到弄 ...

  • 电压比较器的工作原理很好理解,知道了原理分析电路很容易

    在电子电路中,常常需要对两个电压进行比较 这个时候就需要使用到电压比较器这个元器件 电压比较器LM393 电压比较器LM393 电压比较器简介 电压比较器是对输入电压进行大小比较的一个电子元器件,常用 ...