-
说明
-
C++重载-
重载概念
- 函数参数不一样,函数名一样.
-
编译器
-
保证唯一
- 可执行文件对于符号
(函数或变量)解析,一般要求全局唯一. - 不能有两个一样的,否则就产生了二义性,二义性在程序中是不允许存在的.
- 可执行文件对于符号
-
怎么做到的呢?
- 回顾重载的亮点:函数参数不一样,函数名一样.
C++的编译器则是对符号进行了魔改.
-
代码
void show() { } void show(int a) { } int main() { show(); }- 注意对比反编译后的结果。
-
反编译结果
- 编译:
g++ -c test.cpp -fno-builtin
[root@localhost cppcompile]# objdump -rd test.o test.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 <_Z4showv>: 0: 55 push %rbp 1: 48 89 e5 mov %rsp,%rbp 4: 5d pop %rbp 5: c3 retq 0000000000000006 <_Z4showi>: 6: 55 push %rbp 7: 48 89 e5 mov %rsp,%rbp a: 89 7d fc mov %edi,-0x4(%rbp) d: 5d pop %rbp e: c3 retq 000000000000000f <main>: f: 55 push %rbp 10: 48 89 e5 mov %rsp,%rbp 13: e8 00 00 00 00 callq 18 <main+0x9> 14: R_X86_64_PC32 _Z4showv-0x4 18: b8 00 00 00 00 mov $0x0,%eax 1d: 5d pop %rbp 1e: c3 retq- 产生的符号被魔改了,
show变成了_Z4showv和_Z4showi. - 分别对应
void show(void)和void show(int). _Z统一前缀,4表示函数名的实际长度.show原函数名.v表示类型.i表示对应i类型.
- 编译:
-
注
- 返回值类型不一样不算重载,因为编译器对返回值没有做处理.
-
总结
- 所以重载的概念就是对符号的魔改达到了符号唯一的区别.
-
-
-
模板
-
说明
- 模板和重载类似.
-
模板符号
-
案例
-
代码
template <typename T> void show(T a) { } int main() { show<float>(1); show<int>(1); } -
反编译
- 编译:
g++ -c test.cpp -fno-builtin
[root@localhost cppcompile]# objdump -rd test.o test.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 <main>: 0: 55 push %rbp 1: 48 89 e5 mov %rsp,%rbp 4: f3 0f 10 05 00 00 00 movss 0x0(%rip),%xmm0 # c <main+0xc> b: 00 8: R_X86_64_PC32 .rodata-0x4 c: e8 00 00 00 00 callq 11 <main+0x11> d: R_X86_64_PC32 _Z4showIfEvT_-0x4 11: bf 01 00 00 00 mov $0x1,%edi 16: e8 00 00 00 00 callq 1b <main+0x1b> 17: R_X86_64_PC32 _Z4showIiEvT_-0x4 1b: b8 00 00 00 00 mov $0x0,%eax 20: 5d pop %rbp 21: c3 retq Disassembly of section .text._Z4showIfEvT_: 0000000000000000 <_Z4showIfEvT_>: 0: 55 push %rbp 1: 48 89 e5 mov %rsp,%rbp 4: f3 0f 11 45 fc movss %xmm0,-0x4(%rbp) 9: 5d pop %rbp a: c3 retq Disassembly of section .text._Z4showIiEvT_: 0000000000000000 <_Z4showIiEvT_>: 0: 55 push %rbp 1: 48 89 e5 mov %rsp,%rbp 4: 89 7d fc mov %edi,-0x4(%rbp) 7: 5d pop %rbp 8: c3 retq- 这里的
Disassembly of section .text._Z4showIiEvT_:说明是一个新的section,名字为.text._Z4showIiEvT_. - 这里只说明一个,另一个类比.
.text说明是代码区(函数基本都放在代码区).不过生成在什么区主要还是由编译器决定.不同的编译器可能不同. .text._Z4showIiEvT_,这里是show<int>(1)这个实例化._Z同样的前缀,4长度,show实际函数,I统一格式,i表示int类型,Evt_统一格式.
- 编译:
-
小结
- 这里达成了符号唯一,但是不同分区,怎么分区合并呢?
- 需要两个
.o才能体现,涉及到了更多的内容,不介绍.
-
-
-
小结
C++模板和重载的简单理解
最新推荐文章于 2022-10-28 17:43:59 发布
773

被折叠的 条评论
为什么被折叠?



