- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
好吧,承认是自己浅薄了 当被问起 C++重载 时,嘴角不自觉的微微上扬,然后脱口而出,C++重载的原则:
- 函数名相同,函数参数列表不同(类型、个数、顺序)
- 匹配原则1:严格匹配,找到再调用
- 匹配原则2:通过隐式类型转换寻求一个匹配,找到则调用
- 注:返回类型不构成重载条件
C++编译时多态也是由 重载函数 来实现的,那既然扯到多态了,顺便也把运行时多态(虚函数)相关的东西简单了说了下 。
结果谁成想,反手就问了C++重载的底层实现原理是怎样的?
这。。。瞬间蒙蔽 。
或者问: 为什么C没有重载,C++有重载 。
------不华丽的分割线------ 。
先说结论: C++针对函数名有经过一种叫 Name Mangling 的特殊处理,网上很多都是翻译成了 命名倾轧 成员函数的函数名会经过Name Mangling处理,得到一个程序中独一无二的词汇.
class Bar{public: int ival;...}
其中的 ival 有可能变成:
ival_3Bar
PS:这个结果,可能会因为编译器的编码方法不同而不同.
class Point{
public:
void x(float newX,int newY);
void x(int newY, float newX);
float x();
...
}
它可能转换为:
class Point{
public:
void x_5PointFfi(float newX, int newY);
void x_5PointFif(int newY, float newX);
float x_5PointFv();
...
}
这也就解释了为什么C++重载对参数类型、顺序、数量作为重载的原则.
至于C为什么不能重载,那是因为编译器只是对 函数名 做了独一无二的命名处理,并没有带上参数相关的信息.
另: 如果声明了 extern "C" ,就会禁止命名倾轧 name mangling 的效果.
------不华丽的分割线------ 。
一个完整的C++编译过程(例如g++ a.cpp生成可执行文件),总共包含以下四个过程:
- 编译预处理,也称预编译,可以使用命令
g++ -E
执行- 编译,可以使用
g++ -S
执行- 汇编,可以使用
as
或者g++ -c
执行- 链接,可以使用
g++ xxx.o xxx.so xxx.a
执行
# -E 编译器对文件进行预处理
g++ -E test.cpp -o test.i //i文件
# -S编译器告诉g++再为c++代码产生汇编语言后停止编译
g++ -S test.i -o test.s
# -c 选项告诉g++仅把源代码编译为机器语言的目标代码
g++ -c test.s -o test.o (-c小写)
# -0 产生可执行文件名
g++ test.0 -o test 写代码来看下:
通过 g++ -c 会将源代码编译成机器语言的目标代码,然后使用 objdump -t 目标文件 将二进制文件进行反汇编,具体如下: 其中, _Z 是规定前缀, 4 是函数名的字符个数, i 是参数列表类型i的首字母 。
C++也提供了 命名反倾轧 1.将名字改编转化成函数名 使用 c++filt 命令可以很容易把名字改编转换成函数名 。
c++filt _Z4funci
nm -C 目标文件 。
objdump -t -C 目标文件 结果如下:
可参考: 绝对强大的三个linux指令: ar, nm, objdump 。
最后此篇关于C++重载底层原理的文章就讲到这里了,如果你想了解更多关于C++重载底层原理的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
本文全面深入地探讨了Docker容器通信技术,从基础概念、网络模型、核心组件到实战应用。详细介绍了不同网络模式及其实现,提供了容器通信的技术细节和实用案例,旨在为专业从业者提供深入的技术洞见和实
📒博客首页:崇尚学技术的科班人 🍣今天给大家带来的文章是《Dubbo快速上手 -- 带你了解Dubbo使用、原理》🍣 🍣希望各位小伙伴们能够耐心的读完这篇文章🍣 🙏博主也在学习阶段,如若发
一、写在前面 我们经常使用npm install ,但是你是否思考过它内部的原理是什么? 1、执行npm install 它背后帮助我们完成了什么操作? 2、我们会发现还有一个成为package-lo
Base64 Base64 是什么?是将字节流转换成可打印字符、将可打印字符转换为字节流的一种算法。Base64 使用 64 个可打印字符来表示转换后的数据。 准确的来说,Base64 不算
目录 协程定义 生成器和yield语义 Future类 IOLoop类 coroutine函数装饰器 总结 tornado中的
切片,这是一个在go语言中引入的新的理念。它有一些特征如下: 对数组抽象 数组长度不固定 可追加元素 切片容量可增大 容量大小成片增加 我们先把上面的理念整理在这
文章来源:https://sourl.cn/HpZHvy 引 言 本文主要论述的是“RPC 实现原理”,那么首先明确一个问题什么是 RPC 呢?RPC 是 Remote Procedure Call
源码地址(包含所有与springmvc相关的,静态文件路径设置,request请求入参接受,返回值处理converter设置等等): spring-framework/WebMvcConfigurat
请通过简单的java类向我展示一个依赖注入(inject)原理的小例子虽然我已经了解了spring,但是如果我需要用简单的java类术语来解释它,那么你能通过一个简单的例子向我展示一下吗?提前致谢。
1、背景 我们平常使用手机和电脑上网,需要访问公网上的网络资源,如逛淘宝和刷视频,那么手机和电脑是怎么知道去哪里去拿到这个网络资源来下载到本地的呢? 就比如我去食堂拿吃的,我需要
大家好,我是飞哥! 现在 iptables 这个工具的应用似乎是越来越广了。不仅仅是在传统的防火墙、NAT 等功能出现,在今天流行的的 Docker、Kubernets、Istio 项目中也经
本篇涉及到的所有接口在公开文档中均无,需要下载 GitHub 上的源码,自己创建私有类的文档。 npm run generateDocumentation -- --private yarn gene
我最近在很多代码中注意到人们将硬编码的配置(如端口号等)值放在类/方法的深处,使其难以找到,也无法配置。 这是否违反了 SOLID 原则?如果不是,我是否可以向我的团队成员引用另一个“原则”来说明为什
我是 C#、WPF 和 MVVM 模式的新手。很抱歉这篇很长的帖子,我试图设定我所有的理解点(或不理解点)。 在研究了很多关于 WPF 提供的命令机制和 MVVM 模式的文本之后,我在弄清楚如何使用这
可比较的 jQuery 函数 $.post("/example/handler", {foo: 1, bar: 2}); 将创建一个带有 post 参数 foo=1&bar=2 的请求。鉴于 $htt
如果Django不使用“延迟查询执行”原则,主要问题是什么? q = Entry.objects.filter(headline__startswith="What") q = q.filter(
我今天发现.NET框架在做计算时遵循BODMAS操作顺序。即计算按以下顺序进行: 括号 订单 部门 乘法 添加 减法 但是我四处搜索并找不到任何文档确认 .NET 绝对 遵循此原则,是否有此类文档?如
已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等方面的建议的问题。您可以编辑问题,以便用事实和引用来回答它。 关闭
API 回顾 在创建 Viewer 时可以直接指定 影像供给器(ImageryProvider),官方提供了一个非常简单的例子,即离屏例子(搜 offline): new Cesium.Viewer(
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be
我是一名优秀的程序员,十分优秀!