美文网首页
函数模板,不是模板类,与函数重载的情况.以及函数模板的机制研究

函数模板,不是模板类,与函数重载的情况.以及函数模板的机制研究

作者: 司马捷 | 来源:发表于2016-08-05 17:06 被阅读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:
    
    
    ...代码太多就不展示了
    

    相关文章

      网友评论

          本文标题:函数模板,不是模板类,与函数重载的情况.以及函数模板的机制研究

          本文链接:https://www.haomeiwen.com/subject/synhsttx.html