C++编译时多态是如何实现的呢?(名字粉碎机制)

这篇具有很好参考价值的文章主要介绍了C++编译时多态是如何实现的呢?(名字粉碎机制)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.在C++中我们可能会使用到很多同名但是底层时如何识的呢?

在linux环境下,我们可以查看汇编代码,这个是我们的源代码。

#include <iostream>
int  swap1(int a,int  b){
    int temp = a;
    a = b;
    b = temp;
    return 0;
}
double  swap1(double a,double  b){
    double temp = a;
    a = b;
    b = temp;
    return 2.0;
}
int main(){
    swap1(1,2);
    swap1(1.0,2.0);
    return 0;
}

我们可以看到有两个同名不同参的函数,然后我们将此文件进行编译。我们来看一下汇编代码。

	.file	"test.cpp"
	.text
	.local	_ZStL8__ioinit
	.comm	_ZStL8__ioinit,1,1
	.globl	_Z5swap1ii
	.type	_Z5swap1ii, @function
_Z5swap1ii:
.LFB1731:
	.cfi_startproc
	endbr64
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	movl	%edi, -20(%rbp)
	movl	%esi, -24(%rbp)
	movl	-20(%rbp), %eax
	movl	%eax, -4(%rbp)
	movl	-24(%rbp), %eax
	movl	%eax, -20(%rbp)
	movl	-4(%rbp), %eax
	movl	%eax, -24(%rbp)
	movl	$0, %eax
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE1731:
	.size	_Z5swap1ii, .-_Z5swap1ii
	.globl	_Z5swap1dd
	.type	_Z5swap1dd, @function
_Z5swap1dd:
.LFB1732:
	.cfi_startproc
	endbr64
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	movsd	%xmm0, -24(%rbp)
	movsd	%xmm1, -32(%rbp)
	movsd	-24(%rbp), %xmm0
	movsd	%xmm0, -8(%rbp)
	movsd	-32(%rbp), %xmm0
	movsd	%xmm0, -24(%rbp)
	movsd	-8(%rbp), %xmm0
	movsd	%xmm0, -32(%rbp)
	movsd	.LC0(%rip), %xmm0
	movq	%xmm0, %rax
	movq	%rax, %xmm0
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE1732:
	.size	_Z5swap1dd, .-_Z5swap1dd
	.globl	main
	.type	main, @function
main:
.LFB1733:
	.cfi_startproc
	endbr64
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	movl	$2, %esi
	movl	$1, %edi
	call	_Z5swap1ii
	movsd	.LC0(%rip), %xmm0
	movq	.LC1(%rip), %rax
	movapd	%xmm0, %xmm1
	movq	%rax, %xmm0
	call	_Z5swap1dd
	movl	$0, %eax
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE1733:
	.size	main, .-main
	.type	_Z41__static_initialization_and_destruction_0ii, @function
_Z41__static_initialization_and_destruction_0ii:
.LFB2228:
	.cfi_startproc
	endbr64
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	subq	$16, %rsp
	movl	%edi, -4(%rbp)
	movl	%esi, -8(%rbp)
	cmpl	$1, -4(%rbp)
	jne	.L9
	cmpl	$65535, -8(%rbp)
	jne	.L9
	leaq	_ZStL8__ioinit(%rip), %rax
	movq	%rax, %rdi
	call	_ZNSt8ios_base4InitC1Ev@PLT
	leaq	__dso_handle(%rip), %rax
	movq	%rax, %rdx
	leaq	_ZStL8__ioinit(%rip), %rax
	movq	%rax, %rsi
	movq	_ZNSt8ios_base4InitD1Ev@GOTPCREL(%rip), %rax
	movq	%rax, %rdi
	call	__cxa_atexit@PLT
.L9:
	nop
	leave
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE2228:
	.size	_Z41__static_initialization_and_destruction_0ii, .-_Z41__static_initialization_and_destruction_0ii
	.type	_GLOBAL__sub_I__Z5swap1ii, @function
_GLOBAL__sub_I__Z5swap1ii:
.LFB2229:
	.cfi_startproc
	endbr64
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	movl	$65535, %esi
	movl	$1, %edi
	call	_Z41__static_initialization_and_destruction_0ii
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE2229:
	.size	_GLOBAL__sub_I__Z5swap1ii, .-_GLOBAL__sub_I__Z5swap1ii
	.section	.init_array,"aw"
	.align 8
	.quad	_GLOBAL__sub_I__Z5swap1ii
	.section	.rodata
	.align 8
.LC0:
	.long	0
	.long	1073741824
	.align 8
.LC1:
	.long	0
	.long	1072693248
	.hidden	__dso_handle
	.ident	"GCC: (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0"
	.section	.note.GNU-stack,"",@progbits
	.section	.note.gnu.property,"a"
	.align 8
	.long	1f - 0f
	.long	4f - 1f
	.long	5
0:
	.string	"GNU"
1:
	.align 8
	.long	0xc0000002
	.long	3f - 2f
2:
	.long	0x3
3:
	.align 8
4:

我们可以从中看到两个相似的东西

        _Z5swap1dd:

        _Z5swap1ii:

        这个就是我们的两个函数,5就是说函数名时五个字符(博主没学过汇编,_Z可能时返回值,swap1是我们的函数名,dd和ii分别时我们形参的类型,大家自己去试试其他的)文章来源地址https://www.toymoban.com/news/detail-732716.html

到了这里,关于C++编译时多态是如何实现的呢?(名字粉碎机制)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 模拟点击是啥?如何实现的呢?

    模拟点击是指在程序中通过代码实现鼠标或键盘的点击操作。这种技术常用于自动化测试、爬虫等领域,可以模拟用户在界面上的点击行为,从而实现程序的自动化操作。 在Python中,可以使用第三方库来实现模拟点击,比较常用的是selenium和pyautogui两个库。 selenium库是一个

    2023年04月16日
    浏览(33)
  • c、c++、java、python、js对比【面向对象、过程;解释、编译语言;封装、继承、多态】

    目录 内存管理、适用 区别 C 手动内存管理:C语言没有内置的安全检查机制,容易出现内存泄漏、缓冲区溢出等安全问题。 适用于系统级编程 C++ 手动内存管理:C++需要程序员手动管理内存,包括分配和释放内存,这可能导致内存泄漏和指针错误。 适用于游戏引擎和系统级编

    2024年02月08日
    浏览(76)
  • selenium库有哪些功能呢?都是如何实现的呢?

    Selenium是一款功能强大的自动化测试框架,主要用于模拟用户在Web浏览器中的行为,可用于测试Web应用程序的功能和性能。除此之外,Selenium还具有以下功能: 浏览器控制: 可以启动、关闭、切换不同的浏览器,如Chrome、Firefox、Edge等。 元素定位: 可以通过CSS选择器、XPath等

    2023年04月22日
    浏览(40)
  • C++面试八股文:std::array如何实现编译器排序?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第25面: 面试官: array 熟悉吗? 二师兄:你说的是原生数组还是 std::array ? 面试官:你觉得两者有什么区别? 二师兄:区别不是很大,原生数组(非动态数组)和std::array都在栈上开辟空间,初始化的时候需要提供数组长度,且

    2024年02月10日
    浏览(50)
  • [C++]:万字超详细讲解多态以及多态的实现原理(面试的必考的c++考点)

    文章目录 前言 一、多态的定义及实现 1.多态的构成条件 2.c++11的override和final 3.重载,重写,重定义的比较 4.抽象类 5.多态的原理 6.多继承中的虚函数表 7.动态绑定和静态绑定 总结 多态的概念: 多态的概念:通俗来说,就是多种形态, 具体点就是去完成某个行为,当不同的

    2023年04月22日
    浏览(62)
  • 【C++】多态的实现及其底层原理

    个人主页:🍝在肯德基吃麻辣烫 我的gitee:gitee仓库 分享一句喜欢的话:热烈的火焰,冰封在最沉默的火山深处。 本文继C++继承之后讲解C++多态。 单单从概念入手不好理解,应该深入理解多态的实现后再回过头来讲解。 现在简单举个例子:我们在购买高铁票时,往往会有成

    2024年02月14日
    浏览(57)
  • C++:多态的底层实现原理 -- 虚函数表

    目录 一. 多态的原理 1.1 虚函数表 1.2 多态的实现原理 1.3 动态绑定与静态绑定 二. 多继承中的虚函数表 2.1 虚函数表的打印 2.2 多继承中虚函数表中的内容存储情况 对于一个含有虚函数的的类,在实例化出来对象以后,对象所存储的内容包含两部分: 类的成员变量。 一

    2023年04月21日
    浏览(40)
  • <c++>虚函数与多态 | 虚函数与纯虚函数 | 多态的实现原理 | 虚析构函数

    🚀 个人简介:CSDN「 博客新星 」TOP 10 , C/C++ 领域新星创作者 💟 作    者: 锡兰_CC ❣️ 📝 专    栏: 从零开始的 c++ 之旅 🌈 若有帮助,还请 关注➕点赞➕收藏 ,不行的话我再努努力💪💪💪 在上一篇文章中,我们介绍了 c++ 中类与对象的继承,继承可以根据一个或

    2023年04月18日
    浏览(39)
  • 【C++学习】第六章多态与虚函数案例实现

    虚函数的作用就是为了实现多态,和php的延时绑定是一样的。 函数重载是静态的,在横向上的功能, 虚函数是类继承上的功能,是动态的。

    2024年02月09日
    浏览(39)
  • Python中如何实现多态?

    在Python中,多态是一种面向对象编程的重要概念,它允许不同的对象对相同的消息作出不同的响应。多态通过方法的重写和方法的继承来实现,具体体现在子类对象能够以父类对象的形式调用方法,并根据子类对象的实际类型执行相应的方法。 下面是一个简单的示例,展示了

    2024年02月11日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包