函数模板,不是模板类,与函数重载的情况.以及函数模板的机制研究
2016-08-05 本文已影响80人
司马捷
这里有:
1.函数模板的基本调用
2.当函数模板和函数重载在一起的时候,先调用普通函数还是函数模板
2.函数模板在c++编译器中的汇编形式
#include <iostream>
using namespace std;
int Max(int a,int b){
cout<<"int Max(int a,int b)"<<endl;
return a>b?a:b;
}
template<typename T>
T Max(T a,T b){
cout<<"T Max(T a,T b)"<<endl;
return a>b?a:b;
}
template<typename T>
T Max(T a,T b,T c){
cout<<""<<endl;
return Max(Max(a, b), c);
}
int main(int argc, const char * argv[]) {
// insert code here...
std::cout << "Hello, World!\n";
int a =1;
int b = 1;
cout<<Max(a, b)<<endl; //当函数模板和普通函数都符合调用时,优先调用普通函数
cout<<Max<>(a,b)<<endl;//若显示使用函数模板,则使用<>类型 类型列表
cout<<Max(3.0, 4.0)<<endl;//如果函数模板产生更好的匹配,则使用函数模板
cout<<Max(5.0,6.0,7.0)<<endl;//一个类中,同名函数重载 调用的是模板函数
cout<<Max('a', 100)<<endl;//调用普通函数,可以隐式的类型转换.//这里不调用模板函数,是因为模板函数要求参数是两个类型一样的参数,模板函数会进行严格的类型匹配检查.
return 0;
}
使用g++ -S main.cpp -0 1.s 命令 ,输出汇编源码
.section __TEXT,__text,regular,pure_instructions
.macosx_version_min 10, 11
.globl __Z3Maxii
.align 4, 0x90
__Z3Maxii: ## @_Z3Maxii
.cfi_startproc
## BB#0:
pushq %rbp
Ltmp0:
.cfi_def_cfa_offset 16
Ltmp1:
.cfi_offset %rbp, -16
movq %rsp, %rbp
Ltmp2:
.cfi_def_cfa_register %rbp
subq $48, %rsp
movq __ZNSt3__14coutE@GOTPCREL(%rip), %rax
leaq L_.str(%rip), %rcx
movl %edi, -20(%rbp)
movl %esi, -24(%rbp)
movq %rax, %rdi
movq %rcx, %rsi
callq __ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc
leaq __ZNSt3__14endlIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_(%rip), %rcx
movq %rax, -8(%rbp)
movq %rcx, -16(%rbp)
movq -8(%rbp), %rdi
callq *-16(%rbp)
movl -20(%rbp), %edx
cmpl -24(%rbp), %edx
movq %rax, -32(%rbp) ## 8-byte Spill
jle LBB0_2
## BB#1:
movl -20(%rbp), %eax
movl %eax, -36(%rbp) ## 4-byte Spill
jmp LBB0_3
LBB0_2:
movl -24(%rbp), %eax
movl %eax, -36(%rbp) ## 4-byte Spill
LBB0_3:
movl -36(%rbp), %eax ## 4-byte Reload
addq $48, %rsp
popq %rbp
retq
.cfi_endproc
.section __TEXT,__textcoal_nt,coalesced,pure_instructions
.globl __ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc
.weak_def_can_be_hidden __ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc
.align 4, 0x90
__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc: ## @_ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc
.cfi_startproc
## BB#0:
pushq %rbp
Ltmp3:
.cfi_def_cfa_offset 16
Ltmp4:
.cfi_offset %rbp, -16
movq %rsp, %rbp
Ltmp5:
.cfi_def_cfa_register %rbp
subq $32, %rsp
movq %rdi, -8(%rbp)
movq %rsi, -16(%rbp)
movq -8(%rbp), %rdi
movq -16(%rbp), %rsi
movq -16(%rbp), %rax
movq %rdi, -24(%rbp) ## 8-byte Spill
movq %rax, %rdi
movq %rsi, -32(%rbp) ## 8-byte Spill
callq __ZNSt3__111char_traitsIcE6lengthEPKc
movq -24(%rbp), %rdi ## 8-byte Reload
movq -32(%rbp), %rsi ## 8-byte Reload
movq %rax, %rdx
callq __ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m
addq $32, %rsp
popq %rbp
retq
.cfi_endproc
.private_extern __ZNSt3__14endlIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_
.globl __ZNSt3__14endlIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_
.weak_definition __ZNSt3__14endlIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_
.align 4, 0x90
__ZNSt3__14endlIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_: ## @_ZNSt3__14endlIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_
Lfunc_begin0:
.cfi_startproc
.cfi_personality 155, ___gxx_personality_v0
.cfi_lsda 16, Lexception0
## BB#0:
pushq %rbp
Ltmp14:
.cfi_def_cfa_offset 16
Ltmp15:
.cfi_offset %rbp, -16
movq %rsp, %rbp
Ltmp16:
.cfi_def_cfa_register %rbp
subq $144, %rsp
movq %rdi, -72(%rbp)
movq %rdi, %rax
movq (%rdi), %rcx
movq -24(%rcx), %rcx
addq %rcx, %rdi
movq %rdi, -32(%rbp)
movb $10, -33(%rbp)
movq -32(%rbp), %rsi
leaq -48(%rbp), %rcx
movq %rcx, %rdi
movq %rax, -80(%rbp) ## 8-byte Spill
movq %rcx, -88(%rbp) ## 8-byte Spill
callq __ZNKSt3__18ios_base6getlocEv
movq -88(%rbp), %rax ## 8-byte Reload
movq %rax, -24(%rbp)
Ltmp6:
movq __ZNSt3__15ctypeIcE2idE@GOTPCREL(%rip), %rsi
movq %rax, %rdi
callq __ZNKSt3__16locale9use_facetERNS0_2idE
Ltmp7:
movq %rax, -96(%rbp) ## 8-byte Spill
jmp LBB2_1
LBB2_1: ## %_ZNSt3__19use_facetINS_5ctypeIcEEEERKT_RKNS_6localeE.exit.i
movb -33(%rbp), %al
movq -96(%rbp), %rcx ## 8-byte Reload
movq %rcx, -8(%rbp)
movb %al, -9(%rbp)
movq -8(%rbp), %rdx
movq (%rdx), %rsi
movq 56(%rsi), %rsi
movsbl -9(%rbp), %edi
Ltmp8:
movl %edi, -100(%rbp) ## 4-byte Spill
movq %rdx, %rdi
movl -100(%rbp), %r8d ## 4-byte Reload
movq %rsi, -112(%rbp) ## 8-byte Spill
movl %r8d, %esi
movq -112(%rbp), %rdx ## 8-byte Reload
callq *%rdx
Ltmp9:
movb %al, -113(%rbp) ## 1-byte Spill
jmp LBB2_5
LBB2_2:
Ltmp10:
...代码太多就不展示了