C++函数的编译

C++中的函数在编译时会根据命名空间、类、参数签名等信息进行重新命名,形成新的函数名。这个重命名的过程是通过一个特殊的算法来实现的,称为 名字编码(Name Mangling)。

Name Mangling 是一种可逆的算法,既可以通过现有函数名计算出新函数名,也可以通过新函数名逆向推演出原有函数名。

Name Mangling 可以确保新函数名的唯一性,只要命名空间、所属的类、参数签名等有一个不同,那么产生的新函数名也不同。

小括号中就是 Name Mangling 产生的新函数名,它们都以”?“开始,以区别C语言中的”_“。

不同的编译器有不同的 Name Mangling 算法,产生的函数名也不一样。

除了函数,某些变量也会经 Name Mangling 算法产生新名字。

成员函数的实现

对象的内存模型中只保留了成员变量,除此之外没有任何其他信息,程序运行时不知道 obj 的类型为 Demo,也不知道它还有一个成员函数 display()。那么,究竟是如何通过对象调用成员函数的呢?

成员函数最终被编译成与对象无关的普通函数,如果函数体中没有成员变量,那问题就很简单,不用对函数做任何处理,直接调用即可。

如果成员函数中使用到了成员变量,该怎么办呢?成员变量的作用域不是全局,不经任何处理就无法在函数内部访问。

C++规定,编译成员函数时要额外添加一个参数,把当前对象的指针传递进去,通过指针来访问成员变量。

这样就完成了对象和成员函数的关联,只不过与我们从表明上看到的相反,不是通过对象找函数,而是通过函数找对象。

这一切都是隐式完成的,对程序员来说完全透明,就好像这个额外的参数不存在一样。

C++函数编译原理和成员函数的实现相关推荐

  1. 详解函数指针和类成员函数指针

    作者:倾夜·陨灭星尘 一.什么是函数指针? 函数指针,顾名思义即指向函数的指针. 如果要问,为什么能用一个指针指向一个函数呢?我觉得要理解这个问题,以及要理解后面的函数指针和类成员函数指针,没有什么比 ...

  2. C++学习笔记(十)成员变量和成员函数分开存储、this指针、空指针访问成员函数、const修饰成员函数、友元

    1.成员变量和成员函数分开存储 //1.在C++中,类内的成员变量和成员函数分开存储 //2.只有非静态成员变量才属于类的对象上 //空对象占用内存空间为:1 //C++编译器会给每个空对象也分配一个 ...

  3. 基类成员函数和派生类成员函数不构成重载

    基类成员和派生类成员的名字一样时会造成遮蔽,这句话对于成员变量很好理解,对于成员函数要引起注意,不管函数的参数如何,只要名字一样就会造成遮蔽.换句话说,基类成员函数和派生类成员函数不会构成重载,如果派 ...

  4. C++ const型成员函数与 non-const型成员函数 (二)

    C++ const型成员函数与 non-const型成员函数 const 型变量的含义,就是不意修改,就是告诉编译器,不想通过一般的形式修改我的值,除非const_cast去除常量性. vs2013 ...

  5. C++普通函数指针和类成员函数指针

    举例1:普通函数指针: int(*fun)(double, int);fun = [](double a, int b) {cout << a << endl;cout < ...

  6. 虚函数,虚函数表,虚函数实现原理,虚函数实现机制,虚函数解决的问题

    虚函数 虚函数表 虚函数实现原理? 虚函数解决的问题?虚函数解决问题的实现机制? 虚函数模型的构建? 虚函数模型的应用?

  7. C++ 常函数(const修饰成员函数)

    常函数 const修饰成员函数 const修饰成员函数 常函数: 1.成员函数后加const后我们称这个函数为常函数. 2.常函数不可以修改成员属性. 3.成员属性声明时加关键字mutable后,在常 ...

  8. C++中常对象与常成员函数以及this与成员函数的联系与区别

    class A { }; /* 小记:对于const声明的对象,针对哪个变哪个不变得问题,实际上就是const后的整体不变 e.g.: const int *A; 或 int const *A; / ...

  9. C++之常引用对象只能调用常成员函数、重载为成员函数和友元函数的区别

    近日写了一道题,遇到了新bug,使博主对C++的逻辑严密性有了更深的体会,特写此博客.本文标题是对两个bug的总结,即本文内容分为两部分. 题目如下: 设计一个CShape抽象类,类中包含纯虚函数   ...

最新文章

  1. 谈谈 Docker 网络
  2. 安卓一个方法多处调用_一个隐藏在方法集和方法调用中且易被忽略的小细节
  3. 面试官:不使用synchronized和lock,如何实现一个线程安全的单例?
  4. 项目: 打字母游戏【c++/c】
  5. mongodb模糊查询_AWS 回击了!推出兼容 MongoDB 的 DocumentDB
  6. leetcode面试题 02.08. 环路检测
  7. hdu 2528:Area(计算几何,求线段与直线交点 + 求多边形面积)
  8. 开放大学建筑构造计算机考试试题,国家开放大学电大专科《建筑构造》2021期末试题及答案(试卷号:2345)...
  9. java 修改Chrome浏览器的默认下载路径
  10. matlab图片数据库读取,MATLAB无法读取图像数据库问题
  11. 2022年全球及中国MICC电缆行业运行战略规划与未来投资策略分析报告
  12. Vue3动态加载图片
  13. 计算机组成原理随堂作业,2019-华南理工-计算机组成原理-随堂作业
  14. IP地址划分(子网划分)及是否同一网段计算
  15. 臭屁净化器——arduino实现
  16. 易經大意(7) 三和 韓長庚 著
  17. python:collisions=pygame.sprite.groupcollide(bullets,aliens,True,True)
  18. Wayos智能重启工具完美破解版
  19. 数据库访问技术的总结 一
  20. (每日一读2019.10.17)基于SE(2)-XYZ约束的地面车辆视觉里程计定位与地图构建

热门文章

  1. linux磁盘管理不用LVM,[linux] LVM磁盘管理(针对xfs和ext4不同文件系统)
  2. 分布式和微服务是什么?二者的区别又是什么?
  3. Java核心类库篇7——多线程
  4. linux tomcat php配置文件在哪个文件夹下,tomcat下,怎么安配备置php ?(linux系统)
  5. php文件防删改,PHP实现增删改查以及防SQL注入
  6. php全局变量的关键字,php的static关键字和全局变量
  7. Linux进阶之路————crond定时任务调度
  8. Java8————日期时间 API
  9. caffe模型文件解析_深度学习 Caffe 初始化流程理解(数据流建立)
  10. 怎样查看电脑系统版本_用什么软件查维修记录 思域HATCHBACK怎样查询维保记录_汽车事故车查询...