• 一个函数返回临时对象引起的编译器优化问题


    我们都知道,如果在一个函数调用另一个函数,假设是 main 函数调用 fun 函数,这个 fun 函数返回一个临时类类型变量,那么这个时候编译器就会在 main 函数申请一个空间并生成一个临时对象,通过拷贝构造函数将 fun 返回的临时变量的值拷贝到这个临时对象。我们看如下的代码:

    #include <iostream> 
    #include <cstring> 
     
    using namespace std;  
     
    class Matrix  
    {  
    public:  
            explicit Matrix(double d = 1.0)  
            {  
                cout << "Matrix::Matrix()" << endl;  
     
                for(int i = 0; i < 10; i++)  
                    for(int j = 0; j < 10; j++)  
                        m[i][j] = d;  
            }  
     
            Matrix(const Matrix& mt)  
            {  
                cout << "Matrix::Matrix(const Matrix&)" << endl;  
                memcpy(this, &mt, sizeof(Matrix));  
            }  
     
            Matrix& operator=(const Matrix& mt)  
            {  
                if(this == &mt)  
                    return *this;  
     
                cout << "Matrix::operator=(const Matrix&)" << endl;  
                memcpy(this, &mt, sizeof(Matrix));  
     
                return *this;  
            }  
     
            friend const Matrix operator+(const Matrix&, const Matrix&);  
            //...  
     
    private:  
            double m[10][10];  
    };  
     
    const Matrix operator+(const Matrix& arg1, const Matrix& arg2)  
    {  
            Matrix sum;  
            for(int i = 0; i < 10; i++)  
                for(int j = 0; j < 10; j++)  
                    sum.m[i][j] = arg1.m[i][j] + arg2.m[i][j];  return sum; 
    }  
     
    int main()  
    {  
            Matrix a(2.0),  b(3.0);
            Matrix c = (a + b);  return 0;  
    } 

    按照我们的预期,输出结果应该是这样的:

    这也正是 vs2012 的执行结果,但是在 GCC4.2.1 中的执行结果却是这样的:

    这样看来,在构造 c 的时候根本就没有调用拷贝构造函数,同时也没用调用赋值操作符和构造函数。这样就会有一个问题,c 到底是怎么构造的?我们把代码改成这样:

    #include <iostream> 
    #include <cstring> 
     
    using namespace std;  
     
    class Matrix  
    {  
    public:  
            explicit Matrix(double d = 1.0)  
            {  
                cout << "Matrix::Matrix()" << endl;  
     
                for(int i = 0; i < 10; i++)  
                    for(int j = 0; j < 10; j++)  
                        m[i][j] = d;  
            }  
     
            Matrix(const Matrix& mt)  
            {  
                cout << "Matrix::Matrix(const Matrix&)" << endl;  
                memcpy(this, &mt, sizeof(Matrix));  
            }  
     
            Matrix& operator=(const Matrix& mt)  
            {  
                if(this == &mt)  
                    return *this;  
     
                cout << "Matrix::operator=(const Matrix&)" << endl;  
                memcpy(this, &mt, sizeof(Matrix));  
     
                return *this;  
            }  
     
            friend const Matrix operator+(const Matrix&, const Matrix&);  
            //...  
     
    private:  
            double m[10][10];  
    };  
     
    const Matrix operator+(const Matrix& arg1, const Matrix& arg2)  
    {  
            Matrix sum;  
            for(int i = 0; i < 10; i++)  
                for(int j = 0; j < 10; j++)  
                    sum.m[i][j] = arg1.m[i][j] + arg2.m[i][j];  
            cout << "Address of sum: " << &sum << endl;
            return sum; 
    }  
     
    int main()  
    {  
            Matrix a(2.0),  b(3.0);
            Matrix c = (a + b);  
            cout << "Address of c:   " << &c << endl;
     
            return 0;  
    } 

    其实就是把 sum 和 c 的地址打了出来,我们会发现在 gcc 的结果如下:

    从这里可以看出,gcc 编译器对 c 的初始化做了优化,它没有再调用拷贝构造函数来构造 c,而是直接让 c 指向了 + 函数里的临时变量。当然这里也让 sum 的空间所有权交给了 main 作用域的 c, 否则在推出 sum 的时候 sum 的空间就应该被释放了。

    这只是我从其执行结果推测的结果,而 gcc 产生的目标文件的汇编代码简直没法看,所以没有研究其汇编代码来验证我的想法,有人看得懂 gcc 的汇编代码的看完结果望告知!下面是代码的gcc汇编代码:

        .section    __TEXT,__text,regular,pure_instructions
        .globl    __ZplRK6MatrixS1_
        .align    4, 0x90
    __ZplRK6MatrixS1_:                      ## @_ZplRK6MatrixS1_
        .cfi_startproc
    ## BB#0:
        pushq    %rbp
    Ltmp2:
        .cfi_def_cfa_offset 16
    Ltmp3:
        .cfi_offset %rbp, -16
        movq    %rsp, %rbp
    Ltmp4:
        .cfi_def_cfa_register %rbp
        subq    $64, %rsp
        movq    %rdi, %rax
        movabsq    $1, %rcx
        cvtsi2sdq    %rcx, %xmm0
        movq    %rsi, -24(%rbp)
        movq    %rdx, -32(%rbp)
        movq    %rdi, -48(%rbp)         ## 8-byte Spill
        movq    %rax, -56(%rbp)         ## 8-byte Spill
        callq    __ZN6MatrixC1Ed
        movl    $0, -36(%rbp)
    LBB0_1:                                 ## =>This Loop Header: Depth=1
                                            ##     Child Loop BB0_3 Depth 2
        cmpl    $10, -36(%rbp)
        jge    LBB0_8
    ## BB#2:                                ##   in Loop: Header=BB0_1 Depth=1
        movl    $0, -40(%rbp)
    LBB0_3:                                 ##   Parent Loop BB0_1 Depth=1
                                            ## =>  This Inner Loop Header: Depth=2
        cmpl    $10, -40(%rbp)
        jge    LBB0_6
    ## BB#4:                                ##   in Loop: Header=BB0_3 Depth=2
        movslq    -40(%rbp), %rax
        movslq    -36(%rbp), %rcx
        movq    -24(%rbp), %rdx
        imulq    $80, %rcx, %rcx
        addq    %rcx, %rdx
        movsd    (%rdx,%rax,8), %xmm0
        movslq    -40(%rbp), %rax
        movslq    -36(%rbp), %rcx
        movq    -32(%rbp), %rdx
        imulq    $80, %rcx, %rcx
        addq    %rcx, %rdx
        addsd    (%rdx,%rax,8), %xmm0
        movslq    -40(%rbp), %rax
        movslq    -36(%rbp), %rcx
        imulq    $80, %rcx, %rcx
        movq    -48(%rbp), %rdx         ## 8-byte Reload
        addq    %rcx, %rdx
        movsd    %xmm0, (%rdx,%rax,8)
    ## BB#5:                                ##   in Loop: Header=BB0_3 Depth=2
        movl    -40(%rbp), %eax
        addl    $1, %eax
        movl    %eax, -40(%rbp)
        jmp    LBB0_3
    LBB0_6:                                 ##   in Loop: Header=BB0_1 Depth=1
        jmp    LBB0_7
    LBB0_7:                                 ##   in Loop: Header=BB0_1 Depth=1
        movl    -36(%rbp), %eax
        addl    $1, %eax
        movl    %eax, -36(%rbp)
        jmp    LBB0_1
    LBB0_8:
        movq    __ZNSt3__14coutE@GOTPCREL(%rip), %rdi
        leaq    L_.str(%rip), %rsi
        callq    __ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc
        movq    -48(%rbp), %rsi         ## 8-byte Reload
        movq    %rax, %rdi
        callq    __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPKv
        leaq    __ZNSt3__14endlIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_(%rip), %rsi
        movq    %rax, -8(%rbp)
        movq    %rsi, -16(%rbp)
        movq    -8(%rbp), %rdi
        callq    *-16(%rbp)
        movq    -56(%rbp), %rsi         ## 8-byte Reload
        movq    %rax, -64(%rbp)         ## 8-byte Spill
        movq    %rsi, %rax
        addq    $64, %rsp
        popq    %rbp
        retq
        .cfi_endproc
    
        .section    __TEXT,__textcoal_nt,coalesced,pure_instructions
        .globl    __ZN6MatrixC1Ed
        .weak_def_can_be_hidden    __ZN6MatrixC1Ed
        .align    4, 0x90
    __ZN6MatrixC1Ed:                        ## @_ZN6MatrixC1Ed
        .cfi_startproc
    ## BB#0:
        pushq    %rbp
    Ltmp7:
        .cfi_def_cfa_offset 16
    Ltmp8:
        .cfi_offset %rbp, -16
        movq    %rsp, %rbp
    Ltmp9:
        .cfi_def_cfa_register %rbp
        subq    $16, %rsp
        movq    %rdi, -8(%rbp)
        movsd    %xmm0, -16(%rbp)
        movq    -8(%rbp), %rdi
        movsd    -16(%rbp), %xmm0
        callq    __ZN6MatrixC2Ed
        addq    $16, %rsp
        popq    %rbp
        retq
        .cfi_endproc
    
        .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
    Ltmp12:
        .cfi_def_cfa_offset 16
    Ltmp13:
        .cfi_offset %rbp, -16
        movq    %rsp, %rbp
    Ltmp14:
        .cfi_def_cfa_register %rbp
        subq    $48, %rsp
        movq    %rdi, -16(%rbp)
        movq    %rsi, -24(%rbp)
        movq    -16(%rbp), %rdi
        movq    -24(%rbp), %rsi
        movq    -24(%rbp), %rax
        movq    %rax, -8(%rbp)
        movq    -8(%rbp), %rax
        movq    %rdi, -32(%rbp)         ## 8-byte Spill
        movq    %rax, %rdi
        movq    %rsi, -40(%rbp)         ## 8-byte Spill
        callq    _strlen
        movq    -32(%rbp), %rdi         ## 8-byte Reload
        movq    -40(%rbp), %rsi         ## 8-byte Reload
        movq    %rax, %rdx
        callq    __ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m
        addq    $48, %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_
        .cfi_startproc
        .cfi_personality 155, ___gxx_personality_v0
    Leh_func_begin3:
        .cfi_lsda 16, Lexception3
    ## BB#0:
        pushq    %rbp
    Ltmp25:
        .cfi_def_cfa_offset 16
    Ltmp26:
        .cfi_offset %rbp, -16
        movq    %rsp, %rbp
    Ltmp27:
        .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)
    Ltmp15:
        movq    __ZNSt3__15ctypeIcE2idE@GOTPCREL(%rip), %rsi
        movq    %rax, %rdi
        callq    __ZNKSt3__16locale9use_facetERNS0_2idE
    Ltmp16:
        movq    %rax, -96(%rbp)         ## 8-byte Spill
        jmp    LBB3_1
    LBB3_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
    Ltmp17:
        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
    Ltmp18:
        movb    %al, -113(%rbp)         ## 1-byte Spill
        jmp    LBB3_5
    LBB3_2:
    Ltmp19:
        movl    %edx, %ecx
        movq    %rax, -56(%rbp)
        movl    %ecx, -60(%rbp)
    Ltmp20:
        leaq    -48(%rbp), %rdi
        callq    __ZNSt3__16localeD1Ev
    Ltmp21:
        jmp    LBB3_3
    LBB3_3:
        movq    -56(%rbp), %rdi
        callq    __Unwind_Resume
    LBB3_4:
    Ltmp22:
        movl    %edx, %ecx
        movq    %rax, %rdi
        movl    %ecx, -120(%rbp)        ## 4-byte Spill
        callq    ___clang_call_terminate
    LBB3_5:                                 ## %_ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5widenEc.exit
        leaq    -48(%rbp), %rdi
        callq    __ZNSt3__16localeD1Ev
        movq    -80(%rbp), %rdi         ## 8-byte Reload
        movb    -113(%rbp), %al         ## 1-byte Reload
        movsbl    %al, %esi
        callq    __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE3putEc
        movq    -72(%rbp), %rdi
        movq    %rax, -128(%rbp)        ## 8-byte Spill
        callq    __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE5flushEv
        movq    -72(%rbp), %rdi
        movq    %rax, -136(%rbp)        ## 8-byte Spill
        movq    %rdi, %rax
        addq    $144, %rsp
        popq    %rbp
        retq
        .cfi_endproc
    Leh_func_end3:
        .section    __TEXT,__gcc_except_tab
        .align    2
    GCC_except_table3:
    Lexception3:
        .byte    255                     ## @LPStart Encoding = omit
        .byte    155                     ## @TType Encoding = indirect pcrel sdata4
        .asciz    "274"                  ## @TType base offset
        .byte    3                       ## Call site Encoding = udata4
        .byte    52                      ## Call site table length
    Lset0 = Leh_func_begin3-Leh_func_begin3 ## >> Call Site 1 <<
        .long    Lset0
    Lset1 = Ltmp15-Leh_func_begin3          ##   Call between Leh_func_begin3 and Ltmp15
        .long    Lset1
        .long    0                       ##     has no landing pad
        .byte    0                       ##   On action: cleanup
    Lset2 = Ltmp15-Leh_func_begin3          ## >> Call Site 2 <<
        .long    Lset2
    Lset3 = Ltmp18-Ltmp15                   ##   Call between Ltmp15 and Ltmp18
        .long    Lset3
    Lset4 = Ltmp19-Leh_func_begin3          ##     jumps to Ltmp19
        .long    Lset4
        .byte    0                       ##   On action: cleanup
    Lset5 = Ltmp20-Leh_func_begin3          ## >> Call Site 3 <<
        .long    Lset5
    Lset6 = Ltmp21-Ltmp20                   ##   Call between Ltmp20 and Ltmp21
        .long    Lset6
    Lset7 = Ltmp22-Leh_func_begin3          ##     jumps to Ltmp22
        .long    Lset7
        .byte    1                       ##   On action: 1
    Lset8 = Ltmp21-Leh_func_begin3          ## >> Call Site 4 <<
        .long    Lset8
    Lset9 = Leh_func_end3-Ltmp21            ##   Call between Ltmp21 and Leh_func_end3
        .long    Lset9
        .long    0                       ##     has no landing pad
        .byte    0                       ##   On action: cleanup
        .byte    1                       ## >> Action Record 1 <<
                                            ##   Catch TypeInfo 1
        .byte    0                       ##   No further actions
                                            ## >> Catch TypeInfos <<
        .long    0                       ## TypeInfo 1
        .align    2
    
        .section    __TEXT,__text,regular,pure_instructions
        .globl    _main
        .align    4, 0x90
    _main:                                  ## @main
        .cfi_startproc
    ## BB#0:
        pushq    %rbp
    Ltmp30:
        .cfi_def_cfa_offset 16
    Ltmp31:
        .cfi_offset %rbp, -16
        movq    %rsp, %rbp
    Ltmp32:
        .cfi_def_cfa_register %rbp
        subq    $2448, %rsp             ## imm = 0x990
        leaq    -824(%rbp), %rdi
        movabsq    $2, %rax
        cvtsi2sdq    %rax, %xmm0
        movl    $0, -20(%rbp)
        callq    __ZN6MatrixC1Ed
        leaq    -1624(%rbp), %rdi
        movabsq    $3, %rax
        cvtsi2sdq    %rax, %xmm0
        callq    __ZN6MatrixC1Ed
        leaq    -2424(%rbp), %rdi
        leaq    -824(%rbp), %rsi
        leaq    -1624(%rbp), %rdx
        callq    __ZplRK6MatrixS1_
        movq    __ZNSt3__14coutE@GOTPCREL(%rip), %rdi
        leaq    L_.str1(%rip), %rsi
        callq    __ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc
        leaq    -2424(%rbp), %rdx
        movq    %rax, %rdi
        movq    %rdx, %rsi
        callq    __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPKv
        movl    $0, %ecx
        leaq    __ZNSt3__14endlIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_(%rip), %rdx
        movq    %rax, -8(%rbp)
        movq    %rdx, -16(%rbp)
        movq    -8(%rbp), %rdi
        movl    %ecx, -2428(%rbp)       ## 4-byte Spill
        callq    *-16(%rbp)
        movl    -2428(%rbp), %ecx       ## 4-byte Reload
        movq    %rax, -2440(%rbp)       ## 8-byte Spill
        movl    %ecx, %eax
        addq    $2448, %rsp             ## imm = 0x990
        popq    %rbp
        retq
        .cfi_endproc
    
        .section    __TEXT,__textcoal_nt,coalesced,pure_instructions
        .private_extern    ___clang_call_terminate
        .globl    ___clang_call_terminate
        .weak_def_can_be_hidden    ___clang_call_terminate
        .align    4, 0x90
    ___clang_call_terminate:                ## @__clang_call_terminate
    ## BB#0:
        pushq    %rbp
        movq    %rsp, %rbp
        subq    $16, %rsp
        callq    ___cxa_begin_catch
        movq    %rax, -8(%rbp)          ## 8-byte Spill
        callq    __ZSt9terminatev
    
        .globl    __ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m
        .weak_def_can_be_hidden    __ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m
        .align    4, 0x90
    __ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m: ## @_ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m
        .cfi_startproc
        .cfi_personality 155, ___gxx_personality_v0
    Leh_func_begin6:
        .cfi_lsda 16, Lexception6
    ## BB#0:
        pushq    %rbp
    Ltmp65:
        .cfi_def_cfa_offset 16
    Ltmp66:
        .cfi_offset %rbp, -16
        movq    %rsp, %rbp
    Ltmp67:
        .cfi_def_cfa_register %rbp
        subq    $416, %rsp              ## imm = 0x1A0
        movq    %rdi, -208(%rbp)
        movq    %rsi, -216(%rbp)
        movq    %rdx, -224(%rbp)
        movq    -208(%rbp), %rsi
    Ltmp33:
        leaq    -240(%rbp), %rdi
        callq    __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryC1ERS3_
    Ltmp34:
        jmp    LBB6_1
    LBB6_1:
        leaq    -240(%rbp), %rax
        movq    %rax, -200(%rbp)
        movq    -200(%rbp), %rax
        movb    (%rax), %cl
        movb    %cl, -273(%rbp)         ## 1-byte Spill
    ## BB#2:
        movb    -273(%rbp), %al         ## 1-byte Reload
        testb    $1, %al
        jne    LBB6_3
        jmp    LBB6_26
    LBB6_3:
        leaq    -264(%rbp), %rax
        movq    -208(%rbp), %rcx
        movq    %rax, -184(%rbp)
        movq    %rcx, -192(%rbp)
        movq    -184(%rbp), %rax
        movq    -192(%rbp), %rcx
        movq    %rax, -152(%rbp)
        movq    %rcx, -160(%rbp)
        movq    -152(%rbp), %rax
        movq    -160(%rbp), %rcx
        movq    (%rcx), %rdx
        movq    -24(%rdx), %rdx
        addq    %rdx, %rcx
        movq    %rcx, -144(%rbp)
        movq    -144(%rbp), %rcx
        movq    %rcx, -136(%rbp)
        movq    -136(%rbp), %rcx
        movq    40(%rcx), %rcx
        movq    %rcx, (%rax)
        movq    -216(%rbp), %rsi
        movq    -208(%rbp), %rax
        movq    (%rax), %rcx
        movq    -24(%rcx), %rcx
        addq    %rcx, %rax
        movq    %rax, -96(%rbp)
        movq    -96(%rbp), %rax
        movl    8(%rax), %edi
        movq    %rsi, -288(%rbp)        ## 8-byte Spill
        movl    %edi, -292(%rbp)        ## 4-byte Spill
    ## BB#4:
        movl    -292(%rbp), %eax        ## 4-byte Reload
        andl    $176, %eax
        cmpl    $32, %eax
        jne    LBB6_6
    ## BB#5:
        movq    -216(%rbp), %rax
        addq    -224(%rbp), %rax
        movq    %rax, -304(%rbp)        ## 8-byte Spill
        jmp    LBB6_7
    LBB6_6:
        movq    -216(%rbp), %rax
        movq    %rax, -304(%rbp)        ## 8-byte Spill
    LBB6_7:
        movq    -304(%rbp), %rax        ## 8-byte Reload
        movq    -216(%rbp), %rcx
        addq    -224(%rbp), %rcx
        movq    -208(%rbp), %rdx
        movq    (%rdx), %rsi
        movq    -24(%rsi), %rsi
        addq    %rsi, %rdx
        movq    -208(%rbp), %rsi
        movq    (%rsi), %rdi
        movq    -24(%rdi), %rdi
        addq    %rdi, %rsi
        movq    %rsi, -80(%rbp)
        movq    -80(%rbp), %rsi
        movl    144(%rsi), %r8d
        movl    $-1, -4(%rbp)
        movl    %r8d, -8(%rbp)
        movl    -4(%rbp), %r8d
        cmpl    -8(%rbp), %r8d
        movq    %rax, -312(%rbp)        ## 8-byte Spill
        movq    %rcx, -320(%rbp)        ## 8-byte Spill
        movq    %rdx, -328(%rbp)        ## 8-byte Spill
        movq    %rsi, -336(%rbp)        ## 8-byte Spill
        jne    LBB6_16
    ## BB#8:
        movq    -336(%rbp), %rax        ## 8-byte Reload
        movq    %rax, -40(%rbp)
        movb    $32, -41(%rbp)
        movq    -40(%rbp), %rsi
    Ltmp35:
        leaq    -56(%rbp), %rdi
        callq    __ZNKSt3__18ios_base6getlocEv
    Ltmp36:
        jmp    LBB6_9
    LBB6_9:                                 ## %.noexc
        leaq    -56(%rbp), %rax
        movq    %rax, -32(%rbp)
    Ltmp37:
        movq    __ZNSt3__15ctypeIcE2idE@GOTPCREL(%rip), %rsi
        movq    %rax, %rdi
        callq    __ZNKSt3__16locale9use_facetERNS0_2idE
    Ltmp38:
        movq    %rax, -344(%rbp)        ## 8-byte Spill
        jmp    LBB6_10
    LBB6_10:                                ## %_ZNSt3__19use_facetINS_5ctypeIcEEEERKT_RKNS_6localeE.exit.i.i
        movb    -41(%rbp), %al
        movq    -344(%rbp), %rcx        ## 8-byte Reload
        movq    %rcx, -16(%rbp)
        movb    %al, -17(%rbp)
        movq    -16(%rbp), %rdx
        movq    (%rdx), %rsi
        movq    56(%rsi), %rsi
        movsbl    -17(%rbp), %edi
    Ltmp39:
        movl    %edi, -348(%rbp)        ## 4-byte Spill
        movq    %rdx, %rdi
        movl    -348(%rbp), %r8d        ## 4-byte Reload
        movq    %rsi, -360(%rbp)        ## 8-byte Spill
        movl    %r8d, %esi
        movq    -360(%rbp), %rdx        ## 8-byte Reload
        callq    *%rdx
    Ltmp40:
        movb    %al, -361(%rbp)         ## 1-byte Spill
        jmp    LBB6_14
    LBB6_11:
    Ltmp41:
        movl    %edx, %ecx
        movq    %rax, -64(%rbp)
        movl    %ecx, -68(%rbp)
    Ltmp42:
        leaq    -56(%rbp), %rdi
        callq    __ZNSt3__16localeD1Ev
    Ltmp43:
        jmp    LBB6_12
    LBB6_12:
        movq    -64(%rbp), %rax
        movl    -68(%rbp), %ecx
        movq    %rax, -376(%rbp)        ## 8-byte Spill
        movl    %ecx, -380(%rbp)        ## 4-byte Spill
        jmp    LBB6_24
    LBB6_13:
    Ltmp44:
        movl    %edx, %ecx
        movq    %rax, %rdi
        movl    %ecx, -384(%rbp)        ## 4-byte Spill
        callq    ___clang_call_terminate
    LBB6_14:                                ## %_ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5widenEc.exit.i
    Ltmp45:
        leaq    -56(%rbp), %rdi
        callq    __ZNSt3__16localeD1Ev
    Ltmp46:
        jmp    LBB6_15
    LBB6_15:                                ## %.noexc1
        movb    -361(%rbp), %al         ## 1-byte Reload
        movsbl    %al, %ecx
        movq    -336(%rbp), %rdx        ## 8-byte Reload
        movl    %ecx, 144(%rdx)
    LBB6_16:                                ## %_ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE4fillEv.exit
        movq    -336(%rbp), %rax        ## 8-byte Reload
        movl    144(%rax), %ecx
        movb    %cl, %dl
        movb    %dl, -385(%rbp)         ## 1-byte Spill
    ## BB#17:
        movq    -264(%rbp), %rdi
    Ltmp47:
        movb    -385(%rbp), %al         ## 1-byte Reload
        movsbl    %al, %r9d
        movq    -288(%rbp), %rsi        ## 8-byte Reload
        movq    -312(%rbp), %rdx        ## 8-byte Reload
        movq    -320(%rbp), %rcx        ## 8-byte Reload
        movq    -328(%rbp), %r8         ## 8-byte Reload
        callq    __ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_
    Ltmp48:
        movq    %rax, -400(%rbp)        ## 8-byte Spill
        jmp    LBB6_18
    LBB6_18:
        leaq    -272(%rbp), %rax
        movq    -400(%rbp), %rcx        ## 8-byte Reload
        movq    %rcx, -272(%rbp)
        movq    %rax, -88(%rbp)
        movq    -88(%rbp), %rax
        cmpq    $0, (%rax)
        jne    LBB6_25
    ## BB#19:
        movq    -208(%rbp), %rax
        movq    (%rax), %rcx
        movq    -24(%rcx), %rcx
        addq    %rcx, %rax
        movq    %rax, -120(%rbp)
        movl    $5, -124(%rbp)
        movq    -120(%rbp), %rax
        movq    %rax, -104(%rbp)
        movl    $5, -108(%rbp)
        movq    -104(%rbp), %rax
        movl    32(%rax), %edx
        orl    $5, %edx
    Ltmp49:
        movq    %rax, %rdi
        movl    %edx, %esi
        callq    __ZNSt3__18ios_base5clearEj
    Ltmp50:
        jmp    LBB6_20
    LBB6_20:                                ## %_ZNSt3__19basic_iosIcNS_11char_traitsIcEEE8setstateEj.exit
        jmp    LBB6_21
    LBB6_21:
        jmp    LBB6_25
    LBB6_22:
    Ltmp56:
        movl    %edx, %ecx
        movq    %rax, -248(%rbp)
        movl    %ecx, -252(%rbp)
        jmp    LBB6_29
    LBB6_23:
    Ltmp51:
        movl    %edx, %ecx
        movq    %rax, -376(%rbp)        ## 8-byte Spill
        movl    %ecx, -380(%rbp)        ## 4-byte Spill
    LBB6_24:                                ## %.body
        movl    -380(%rbp), %eax        ## 4-byte Reload
        movq    -376(%rbp), %rcx        ## 8-byte Reload
        movq    %rcx, -248(%rbp)
        movl    %eax, -252(%rbp)
    Ltmp52:
        leaq    -240(%rbp), %rdi
        callq    __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1Ev
    Ltmp53:
        jmp    LBB6_28
    LBB6_25:
        jmp    LBB6_26
    LBB6_26:
    Ltmp54:
        leaq    -240(%rbp), %rdi
        callq    __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1Ev
    Ltmp55:
        jmp    LBB6_27
    LBB6_27:
        jmp    LBB6_31
    LBB6_28:
        jmp    LBB6_29
    LBB6_29:
        movq    -248(%rbp), %rdi
        callq    ___cxa_begin_catch
        movq    -208(%rbp), %rdi
        movq    (%rdi), %rcx
        movq    -24(%rcx), %rcx
        addq    %rcx, %rdi
    Ltmp57:
        movq    %rax, -408(%rbp)        ## 8-byte Spill
        callq    __ZNSt3__18ios_base33__set_badbit_and_consider_rethrowEv
    Ltmp58:
        jmp    LBB6_30
    LBB6_30:
        callq    ___cxa_end_catch
    LBB6_31:
        movq    -208(%rbp), %rax
        addq    $416, %rsp              ## imm = 0x1A0
        popq    %rbp
        retq
    LBB6_32:
    Ltmp59:
        movl    %edx, %ecx
        movq    %rax, -248(%rbp)
        movl    %ecx, -252(%rbp)
    Ltmp60:
        callq    ___cxa_end_catch
    Ltmp61:
        jmp    LBB6_33
    LBB6_33:
        jmp    LBB6_34
    LBB6_34:
        movq    -248(%rbp), %rdi
        callq    __Unwind_Resume
    LBB6_35:
    Ltmp62:
        movl    %edx, %ecx
        movq    %rax, %rdi
        movl    %ecx, -412(%rbp)        ## 4-byte Spill
        callq    ___clang_call_terminate
        .cfi_endproc
    Leh_func_end6:
        .section    __TEXT,__gcc_except_tab
        .align    2
    GCC_except_table6:
    Lexception6:
        .byte    255                     ## @LPStart Encoding = omit
        .byte    155                     ## @TType Encoding = indirect pcrel sdata4
        .asciz    "253201"              ## @TType base offset
        .byte    3                       ## Call site Encoding = udata4
        .ascii    "23401"              ## Call site table length
    Lset10 = Ltmp33-Leh_func_begin6         ## >> Call Site 1 <<
        .long    Lset10
    Lset11 = Ltmp34-Ltmp33                  ##   Call between Ltmp33 and Ltmp34
        .long    Lset11
    Lset12 = Ltmp56-Leh_func_begin6         ##     jumps to Ltmp56
        .long    Lset12
        .byte    5                       ##   On action: 3
    Lset13 = Ltmp35-Leh_func_begin6         ## >> Call Site 2 <<
        .long    Lset13
    Lset14 = Ltmp36-Ltmp35                  ##   Call between Ltmp35 and Ltmp36
        .long    Lset14
    Lset15 = Ltmp51-Leh_func_begin6         ##     jumps to Ltmp51
        .long    Lset15
        .byte    5                       ##   On action: 3
    Lset16 = Ltmp37-Leh_func_begin6         ## >> Call Site 3 <<
        .long    Lset16
    Lset17 = Ltmp40-Ltmp37                  ##   Call between Ltmp37 and Ltmp40
        .long    Lset17
    Lset18 = Ltmp41-Leh_func_begin6         ##     jumps to Ltmp41
        .long    Lset18
        .byte    3                       ##   On action: 2
    Lset19 = Ltmp42-Leh_func_begin6         ## >> Call Site 4 <<
        .long    Lset19
    Lset20 = Ltmp43-Ltmp42                  ##   Call between Ltmp42 and Ltmp43
        .long    Lset20
    Lset21 = Ltmp44-Leh_func_begin6         ##     jumps to Ltmp44
        .long    Lset21
        .byte    7                       ##   On action: 4
    Lset22 = Ltmp45-Leh_func_begin6         ## >> Call Site 5 <<
        .long    Lset22
    Lset23 = Ltmp50-Ltmp45                  ##   Call between Ltmp45 and Ltmp50
        .long    Lset23
    Lset24 = Ltmp51-Leh_func_begin6         ##     jumps to Ltmp51
        .long    Lset24
        .byte    5                       ##   On action: 3
    Lset25 = Ltmp52-Leh_func_begin6         ## >> Call Site 6 <<
        .long    Lset25
    Lset26 = Ltmp53-Ltmp52                  ##   Call between Ltmp52 and Ltmp53
        .long    Lset26
    Lset27 = Ltmp62-Leh_func_begin6         ##     jumps to Ltmp62
        .long    Lset27
        .byte    5                       ##   On action: 3
    Lset28 = Ltmp54-Leh_func_begin6         ## >> Call Site 7 <<
        .long    Lset28
    Lset29 = Ltmp55-Ltmp54                  ##   Call between Ltmp54 and Ltmp55
        .long    Lset29
    Lset30 = Ltmp56-Leh_func_begin6         ##     jumps to Ltmp56
        .long    Lset30
        .byte    5                       ##   On action: 3
    Lset31 = Ltmp55-Leh_func_begin6         ## >> Call Site 8 <<
        .long    Lset31
    Lset32 = Ltmp57-Ltmp55                  ##   Call between Ltmp55 and Ltmp57
        .long    Lset32
        .long    0                       ##     has no landing pad
        .byte    0                       ##   On action: cleanup
    Lset33 = Ltmp57-Leh_func_begin6         ## >> Call Site 9 <<
        .long    Lset33
    Lset34 = Ltmp58-Ltmp57                  ##   Call between Ltmp57 and Ltmp58
        .long    Lset34
    Lset35 = Ltmp59-Leh_func_begin6         ##     jumps to Ltmp59
        .long    Lset35
        .byte    0                       ##   On action: cleanup
    Lset36 = Ltmp58-Leh_func_begin6         ## >> Call Site 10 <<
        .long    Lset36
    Lset37 = Ltmp60-Ltmp58                  ##   Call between Ltmp58 and Ltmp60
        .long    Lset37
        .long    0                       ##     has no landing pad
        .byte    0                       ##   On action: cleanup
    Lset38 = Ltmp60-Leh_func_begin6         ## >> Call Site 11 <<
        .long    Lset38
    Lset39 = Ltmp61-Ltmp60                  ##   Call between Ltmp60 and Ltmp61
        .long    Lset39
    Lset40 = Ltmp62-Leh_func_begin6         ##     jumps to Ltmp62
        .long    Lset40
        .byte    5                       ##   On action: 3
    Lset41 = Ltmp61-Leh_func_begin6         ## >> Call Site 12 <<
        .long    Lset41
    Lset42 = Leh_func_end6-Ltmp61           ##   Call between Ltmp61 and Leh_func_end6
        .long    Lset42
        .long    0                       ##     has no landing pad
        .byte    0                       ##   On action: cleanup
        .byte    0                       ## >> Action Record 1 <<
                                            ##   Cleanup
        .byte    0                       ##   No further actions
        .byte    1                       ## >> Action Record 2 <<
                                            ##   Catch TypeInfo 1
        .byte    125                     ##   Continue to action 1
        .byte    1                       ## >> Action Record 3 <<
                                            ##   Catch TypeInfo 1
        .byte    0                       ##   No further actions
        .byte    1                       ## >> Action Record 4 <<
                                            ##   Catch TypeInfo 1
        .byte    125                     ##   Continue to action 3
                                            ## >> Catch TypeInfos <<
        .long    0                       ## TypeInfo 1
        .align    2
    
        .section    __TEXT,__textcoal_nt,coalesced,pure_instructions
        .private_extern    __ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_
        .globl    __ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_
        .weak_def_can_be_hidden    __ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_
        .align    4, 0x90
    __ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_: ## @_ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_
        .cfi_startproc
        .cfi_personality 155, ___gxx_personality_v0
    Leh_func_begin7:
        .cfi_lsda 16, Lexception7
    ## BB#0:
        pushq    %rbp
    Ltmp76:
        .cfi_def_cfa_offset 16
    Ltmp77:
        .cfi_offset %rbp, -16
        movq    %rsp, %rbp
    Ltmp78:
        .cfi_def_cfa_register %rbp
        subq    $720, %rsp              ## imm = 0x2D0
        movb    %r9b, %al
        leaq    -552(%rbp), %r10
        leaq    -488(%rbp), %r11
        movq    %rdi, -504(%rbp)
        movq    %rsi, -512(%rbp)
        movq    %rdx, -520(%rbp)
        movq    %rcx, -528(%rbp)
        movq    %r8, -536(%rbp)
        movb    %al, -537(%rbp)
        movq    -504(%rbp), %rcx
        movq    %r11, -472(%rbp)
        movq    $-1, -480(%rbp)
        movq    -472(%rbp), %rdx
        movq    -480(%rbp), %rsi
        movq    %rdx, -456(%rbp)
        movq    %rsi, -464(%rbp)
        movq    -456(%rbp), %rdx
        movq    $0, (%rdx)
        movq    -488(%rbp), %rdx
        movq    %rdx, -552(%rbp)
        movq    %r10, -448(%rbp)
        cmpq    $0, %rcx
        jne    LBB7_2
    ## BB#1:
        movq    -504(%rbp), %rax
        movq    %rax, -496(%rbp)
        jmp    LBB7_29
    LBB7_2:
        movq    -528(%rbp), %rax
        movq    -512(%rbp), %rcx
        subq    %rcx, %rax
        movq    %rax, -560(%rbp)
        movq    -536(%rbp), %rax
        movq    %rax, -344(%rbp)
        movq    -344(%rbp), %rax
        movq    24(%rax), %rax
        movq    %rax, -568(%rbp)
        movq    -568(%rbp), %rax
        cmpq    -560(%rbp), %rax
        jle    LBB7_4
    ## BB#3:
        movq    -560(%rbp), %rax
        movq    -568(%rbp), %rcx
        subq    %rax, %rcx
        movq    %rcx, -568(%rbp)
        jmp    LBB7_5
    LBB7_4:
        movq    $0, -568(%rbp)
    LBB7_5:
        movq    -520(%rbp), %rax
        movq    -512(%rbp), %rcx
        subq    %rcx, %rax
        movq    %rax, -576(%rbp)
        cmpq    $0, -576(%rbp)
        jle    LBB7_9
    ## BB#6:
        movq    -504(%rbp), %rax
        movq    -512(%rbp), %rcx
        movq    -576(%rbp), %rdx
        movq    %rax, -248(%rbp)
        movq    %rcx, -256(%rbp)
        movq    %rdx, -264(%rbp)
        movq    -248(%rbp), %rax
        movq    (%rax), %rcx
        movq    96(%rcx), %rcx
        movq    -256(%rbp), %rsi
        movq    -264(%rbp), %rdx
        movq    %rax, %rdi
        callq    *%rcx
        cmpq    -576(%rbp), %rax
        je    LBB7_8
    ## BB#7:
        leaq    -584(%rbp), %rax
        leaq    -240(%rbp), %rcx
        movq    %rcx, -224(%rbp)
        movq    $-1, -232(%rbp)
        movq    -224(%rbp), %rcx
        movq    -232(%rbp), %rdx
        movq    %rcx, -208(%rbp)
        movq    %rdx, -216(%rbp)
        movq    -208(%rbp), %rcx
        movq    $0, (%rcx)
        movq    -240(%rbp), %rcx
        movq    %rcx, -584(%rbp)
        movq    %rax, -8(%rbp)
        movq    $0, -504(%rbp)
        movq    -504(%rbp), %rax
        movq    %rax, -496(%rbp)
        jmp    LBB7_29
    LBB7_8:
        jmp    LBB7_9
    LBB7_9:
        cmpq    $0, -568(%rbp)
        jle    LBB7_24
    ## BB#10:
        leaq    -608(%rbp), %rax
        movq    -568(%rbp), %rcx
        movb    -537(%rbp), %dl
        movq    %rax, -72(%rbp)
        movq    %rcx, -80(%rbp)
        movb    %dl, -81(%rbp)
        movq    -72(%rbp), %rax
        movq    -80(%rbp), %rcx
        movb    -81(%rbp), %dl
        movq    %rax, -48(%rbp)
        movq    %rcx, -56(%rbp)
        movb    %dl, -57(%rbp)
        movq    -48(%rbp), %rax
        movq    %rax, -40(%rbp)
        movq    -40(%rbp), %rcx
        movq    %rcx, -32(%rbp)
        movq    -32(%rbp), %rcx
        movq    %rcx, -24(%rbp)
        movq    -24(%rbp), %rcx
        movq    %rcx, -16(%rbp)
        movq    -56(%rbp), %rsi
        movq    %rax, %rdi
        movsbl    -57(%rbp), %edx
        callq    __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEmc
        leaq    -608(%rbp), %rax
        movq    -504(%rbp), %rcx
        movq    %rax, -200(%rbp)
        movq    -200(%rbp), %rax
        movq    %rax, -192(%rbp)
        movq    -192(%rbp), %rax
        movq    %rax, -184(%rbp)
        movq    -184(%rbp), %rsi
        movq    %rsi, -176(%rbp)
        movq    -176(%rbp), %rsi
        movq    %rsi, -168(%rbp)
        movq    -168(%rbp), %rsi
        movzbl    (%rsi), %edx
        andl    $1, %edx
        cmpl    $0, %edx
        movq    %rcx, -656(%rbp)        ## 8-byte Spill
        movq    %rax, -664(%rbp)        ## 8-byte Spill
        je    LBB7_12
    ## BB#11:
        movq    -664(%rbp), %rax        ## 8-byte Reload
        movq    %rax, -120(%rbp)
        movq    -120(%rbp), %rcx
        movq    %rcx, -112(%rbp)
        movq    -112(%rbp), %rcx
        movq    %rcx, -104(%rbp)
        movq    -104(%rbp), %rcx
        movq    16(%rcx), %rcx
        movq    %rcx, -672(%rbp)        ## 8-byte Spill
        jmp    LBB7_13
    LBB7_12:
        movq    -664(%rbp), %rax        ## 8-byte Reload
        movq    %rax, -160(%rbp)
        movq    -160(%rbp), %rcx
        movq    %rcx, -152(%rbp)
        movq    -152(%rbp), %rcx
        movq    %rcx, -144(%rbp)
        movq    -144(%rbp), %rcx
        addq    $1, %rcx
        movq    %rcx, -136(%rbp)
        movq    -136(%rbp), %rcx
        movq    %rcx, -128(%rbp)
        movq    -128(%rbp), %rcx
        movq    %rcx, -672(%rbp)        ## 8-byte Spill
    LBB7_13:                                ## %_ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4dataEv.exit
        movq    -672(%rbp), %rax        ## 8-byte Reload
        movq    %rax, -96(%rbp)
        movq    -568(%rbp), %rcx
        movq    -656(%rbp), %rdx        ## 8-byte Reload
        movq    %rdx, -272(%rbp)
        movq    %rax, -280(%rbp)
        movq    %rcx, -288(%rbp)
        movq    -272(%rbp), %rax
        movq    (%rax), %rsi
        movq    96(%rsi), %rsi
        movq    -280(%rbp), %rdi
    Ltmp68:
        movq    %rdi, -680(%rbp)        ## 8-byte Spill
        movq    %rax, %rdi
        movq    -680(%rbp), %rax        ## 8-byte Reload
        movq    %rsi, -688(%rbp)        ## 8-byte Spill
        movq    %rax, %rsi
        movq    %rcx, %rdx
        movq    -688(%rbp), %rcx        ## 8-byte Reload
        callq    *%rcx
    Ltmp69:
        movq    %rax, -696(%rbp)        ## 8-byte Spill
        jmp    LBB7_14
    LBB7_14:                                ## %_ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputnEPKcl.exit
        jmp    LBB7_15
    LBB7_15:
        movq    -696(%rbp), %rax        ## 8-byte Reload
        cmpq    -568(%rbp), %rax
        je    LBB7_20
    ## BB#16:
        leaq    -328(%rbp), %rax
        movq    %rax, -312(%rbp)
        movq    $-1, -320(%rbp)
        movq    -312(%rbp), %rax
        movq    -320(%rbp), %rcx
        movq    %rax, -296(%rbp)
        movq    %rcx, -304(%rbp)
        movq    -296(%rbp), %rax
        movq    $0, (%rax)
        movq    -328(%rbp), %rax
        movq    %rax, -704(%rbp)        ## 8-byte Spill
    ## BB#17:
        leaq    -632(%rbp), %rax
        movq    -704(%rbp), %rcx        ## 8-byte Reload
        movq    %rcx, -632(%rbp)
        movq    %rax, -336(%rbp)
    ## BB#18:
        movq    $0, -504(%rbp)
        movq    -504(%rbp), %rax
        movq    %rax, -496(%rbp)
        movl    $1, -636(%rbp)
        jmp    LBB7_21
    LBB7_19:
    Ltmp70:
        movl    %edx, %ecx
        movq    %rax, -616(%rbp)
        movl    %ecx, -620(%rbp)
    Ltmp71:
        leaq    -608(%rbp), %rdi
        callq    __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev
    Ltmp72:
        jmp    LBB7_23
    LBB7_20:
        movl    $0, -636(%rbp)
    LBB7_21:
        leaq    -608(%rbp), %rdi
        callq    __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev
        movl    -636(%rbp), %eax
        movl    %eax, %ecx
        subl    $1, %ecx
        movl    %eax, -708(%rbp)        ## 4-byte Spill
        movl    %ecx, -712(%rbp)        ## 4-byte Spill
        je    LBB7_29
        jmp    LBB7_33
    LBB7_33:
        movl    -708(%rbp), %eax        ## 4-byte Reload
        testl    %eax, %eax
        jne    LBB7_32
        jmp    LBB7_22
    LBB7_22:
        jmp    LBB7_24
    LBB7_23:
        jmp    LBB7_30
    LBB7_24:
        movq    -528(%rbp), %rax
        movq    -520(%rbp), %rcx
        subq    %rcx, %rax
        movq    %rax, -576(%rbp)
        cmpq    $0, -576(%rbp)
        jle    LBB7_28
    ## BB#25:
        movq    -504(%rbp), %rax
        movq    -520(%rbp), %rcx
        movq    -576(%rbp), %rdx
        movq    %rax, -352(%rbp)
        movq    %rcx, -360(%rbp)
        movq    %rdx, -368(%rbp)
        movq    -352(%rbp), %rax
        movq    (%rax), %rcx
        movq    96(%rcx), %rcx
        movq    -360(%rbp), %rsi
        movq    -368(%rbp), %rdx
        movq    %rax, %rdi
        callq    *%rcx
        cmpq    -576(%rbp), %rax
        je    LBB7_27
    ## BB#26:
        leaq    -648(%rbp), %rax
        leaq    -408(%rbp), %rcx
        movq    %rcx, -392(%rbp)
        movq    $-1, -400(%rbp)
        movq    -392(%rbp), %rcx
        movq    -400(%rbp), %rdx
        movq    %rcx, -376(%rbp)
        movq    %rdx, -384(%rbp)
        movq    -376(%rbp), %rcx
        movq    $0, (%rcx)
        movq    -408(%rbp), %rcx
        movq    %rcx, -648(%rbp)
        movq    %rax, -416(%rbp)
        movq    $0, -504(%rbp)
        movq    -504(%rbp), %rax
        movq    %rax, -496(%rbp)
        jmp    LBB7_29
    LBB7_27:
        jmp    LBB7_28
    LBB7_28:
        movq    -536(%rbp), %rax
        movq    %rax, -424(%rbp)
        movq    $0, -432(%rbp)
        movq    -424(%rbp), %rax
        movq    24(%rax), %rcx
        movq    %rcx, -440(%rbp)
        movq    -432(%rbp), %rcx
        movq    %rcx, 24(%rax)
        movq    -504(%rbp), %rax
        movq    %rax, -496(%rbp)
    LBB7_29:
        movq    -496(%rbp), %rax
        addq    $720, %rsp              ## imm = 0x2D0
        popq    %rbp
        retq
    LBB7_30:
        movq    -616(%rbp), %rdi
        callq    __Unwind_Resume
    LBB7_31:
    Ltmp73:
        movl    %edx, %ecx
        movq    %rax, %rdi
        movl    %ecx, -716(%rbp)        ## 4-byte Spill
        callq    ___clang_call_terminate
    LBB7_32:
        .cfi_endproc
    Leh_func_end7:
        .section    __TEXT,__gcc_except_tab
        .align    2
    GCC_except_table7:
    Lexception7:
        .byte    255                     ## @LPStart Encoding = omit
        .byte    155                     ## @TType Encoding = indirect pcrel sdata4
        .asciz    "274"                  ## @TType base offset
        .byte    3                       ## Call site Encoding = udata4
        .byte    52                      ## Call site table length
    Lset43 = Leh_func_begin7-Leh_func_begin7 ## >> Call Site 1 <<
        .long    Lset43
    Lset44 = Ltmp68-Leh_func_begin7         ##   Call between Leh_func_begin7 and Ltmp68
        .long    Lset44
        .long    0                       ##     has no landing pad
        .byte    0                       ##   On action: cleanup
    Lset45 = Ltmp68-Leh_func_begin7         ## >> Call Site 2 <<
        .long    Lset45
    Lset46 = Ltmp69-Ltmp68                  ##   Call between Ltmp68 and Ltmp69
        .long    Lset46
    Lset47 = Ltmp70-Leh_func_begin7         ##     jumps to Ltmp70
        .long    Lset47
        .byte    0                       ##   On action: cleanup
    Lset48 = Ltmp71-Leh_func_begin7         ## >> Call Site 3 <<
        .long    Lset48
    Lset49 = Ltmp72-Ltmp71                  ##   Call between Ltmp71 and Ltmp72
        .long    Lset49
    Lset50 = Ltmp73-Leh_func_begin7         ##     jumps to Ltmp73
        .long    Lset50
        .byte    1                       ##   On action: 1
    Lset51 = Ltmp72-Leh_func_begin7         ## >> Call Site 4 <<
        .long    Lset51
    Lset52 = Leh_func_end7-Ltmp72           ##   Call between Ltmp72 and Leh_func_end7
        .long    Lset52
        .long    0                       ##     has no landing pad
        .byte    0                       ##   On action: cleanup
        .byte    1                       ## >> Action Record 1 <<
                                            ##   Catch TypeInfo 1
        .byte    0                       ##   No further actions
                                            ## >> Catch TypeInfos <<
        .long    0                       ## TypeInfo 1
        .align    2
    
        .section    __TEXT,__textcoal_nt,coalesced,pure_instructions
        .globl    __ZN6MatrixC2Ed
        .weak_def_can_be_hidden    __ZN6MatrixC2Ed
        .align    4, 0x90
    __ZN6MatrixC2Ed:                        ## @_ZN6MatrixC2Ed
        .cfi_startproc
    ## BB#0:
        pushq    %rbp
    Ltmp81:
        .cfi_def_cfa_offset 16
    Ltmp82:
        .cfi_offset %rbp, -16
        movq    %rsp, %rbp
    Ltmp83:
        .cfi_def_cfa_register %rbp
        subq    $64, %rsp
        movq    __ZNSt3__14coutE@GOTPCREL(%rip), %rax
        leaq    L_.str2(%rip), %rsi
        movq    %rdi, -24(%rbp)
        movsd    %xmm0, -32(%rbp)
        movq    -24(%rbp), %rdi
        movq    %rdi, -48(%rbp)         ## 8-byte Spill
        movq    %rax, %rdi
        callq    __ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc
        leaq    __ZNSt3__14endlIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_(%rip), %rsi
        movq    %rax, -8(%rbp)
        movq    %rsi, -16(%rbp)
        movq    -8(%rbp), %rdi
        callq    *-16(%rbp)
        movl    $0, -36(%rbp)
        movq    %rax, -56(%rbp)         ## 8-byte Spill
    LBB8_1:                                 ## =>This Loop Header: Depth=1
                                            ##     Child Loop BB8_3 Depth 2
        cmpl    $10, -36(%rbp)
        jge    LBB8_8
    ## BB#2:                                ##   in Loop: Header=BB8_1 Depth=1
        movl    $0, -40(%rbp)
    LBB8_3:                                 ##   Parent Loop BB8_1 Depth=1
                                            ## =>  This Inner Loop Header: Depth=2
        cmpl    $10, -40(%rbp)
        jge    LBB8_6
    ## BB#4:                                ##   in Loop: Header=BB8_3 Depth=2
        movsd    -32(%rbp), %xmm0
        movslq    -40(%rbp), %rax
        movslq    -36(%rbp), %rcx
        imulq    $80, %rcx, %rcx
        movq    -48(%rbp), %rdx         ## 8-byte Reload
        addq    %rcx, %rdx
        movsd    %xmm0, (%rdx,%rax,8)
    ## BB#5:                                ##   in Loop: Header=BB8_3 Depth=2
        movl    -40(%rbp), %eax
        addl    $1, %eax
        movl    %eax, -40(%rbp)
        jmp    LBB8_3
    LBB8_6:                                 ##   in Loop: Header=BB8_1 Depth=1
        jmp    LBB8_7
    LBB8_7:                                 ##   in Loop: Header=BB8_1 Depth=1
        movl    -36(%rbp), %eax
        addl    $1, %eax
        movl    %eax, -36(%rbp)
        jmp    LBB8_1
    LBB8_8:
        addq    $64, %rsp
        popq    %rbp
        retq
        .cfi_endproc
    
        .section    __TEXT,__cstring,cstring_literals
    L_.str:                                 ## @.str
        .asciz    "Address of sum: "
    
    L_.str1:                                ## @.str1
        .asciz    "Address of c:   "
    
    L_.str2:                                ## @.str2
        .asciz    "Matrix::Matrix()"
    
        .section    __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
    
    .subsections_via_symbols

    而这时简化版的代码(突出返回临时对象):

    #include <iostream> 
    #include <cstring> 
     
    using namespace std;  
     
    class Matrix  
    {  
    public:  
            explicit Matrix()  {  }   
            friend const Matrix operator+(const Matrix&, const Matrix&);   
    };  
     
    const Matrix operator+(const Matrix& arg1, const Matrix& arg2)  
    {  
            Matrix sum;  
            return sum; 
    }  
     
    int main()  
    {  
            Matrix a,  b;
            Matrix c = (a + b);  
     
            return 0;  
    } 

    汇编:

        .section    __TEXT,__text,regular,pure_instructions
        .globl    __ZplRK6MatrixS1_
        .align    4, 0x90
    __ZplRK6MatrixS1_:                      ## @_ZplRK6MatrixS1_
        .cfi_startproc
    ## BB#0:
        pushq    %rbp
    Ltmp2:
        .cfi_def_cfa_offset 16
    Ltmp3:
        .cfi_offset %rbp, -16
        movq    %rsp, %rbp
    Ltmp4:
        .cfi_def_cfa_register %rbp
        subq    $32, %rsp
        leaq    -8(%rbp), %rax
        movq    %rdi, -16(%rbp)
        movq    %rsi, -24(%rbp)
        movq    %rax, %rdi
        callq    __ZN6MatrixC1Ev
        addq    $32, %rsp
        popq    %rbp
        retq
        .cfi_endproc
    
        .section    __TEXT,__textcoal_nt,coalesced,pure_instructions
        .globl    __ZN6MatrixC1Ev
        .weak_def_can_be_hidden    __ZN6MatrixC1Ev
        .align    4, 0x90
    __ZN6MatrixC1Ev:                        ## @_ZN6MatrixC1Ev
        .cfi_startproc
    ## BB#0:
        pushq    %rbp
    Ltmp7:
        .cfi_def_cfa_offset 16
    Ltmp8:
        .cfi_offset %rbp, -16
        movq    %rsp, %rbp
    Ltmp9:
        .cfi_def_cfa_register %rbp
        subq    $16, %rsp
        movq    %rdi, -8(%rbp)
        movq    -8(%rbp), %rdi
        callq    __ZN6MatrixC2Ev
        addq    $16, %rsp
        popq    %rbp
        retq
        .cfi_endproc
    
        .section    __TEXT,__text,regular,pure_instructions
        .globl    _main
        .align    4, 0x90
    _main:                                  ## @main
        .cfi_startproc
    ## BB#0:
        pushq    %rbp
    Ltmp12:
        .cfi_def_cfa_offset 16
    Ltmp13:
        .cfi_offset %rbp, -16
        movq    %rsp, %rbp
    Ltmp14:
        .cfi_def_cfa_register %rbp
        subq    $32, %rsp
        leaq    -8(%rbp), %rdi
        movl    $0, -4(%rbp)
        callq    __ZN6MatrixC1Ev
        leaq    -16(%rbp), %rdi
        callq    __ZN6MatrixC1Ev
        leaq    -8(%rbp), %rdi
        leaq    -16(%rbp), %rsi
        callq    __ZplRK6MatrixS1_
        movl    $0, %eax
        addq    $32, %rsp
        popq    %rbp
        retq
        .cfi_endproc
    
        .section    __TEXT,__textcoal_nt,coalesced,pure_instructions
        .globl    __ZN6MatrixC2Ev
        .weak_def_can_be_hidden    __ZN6MatrixC2Ev
        .align    4, 0x90
    __ZN6MatrixC2Ev:                        ## @_ZN6MatrixC2Ev
        .cfi_startproc
    ## BB#0:
        pushq    %rbp
    Ltmp17:
        .cfi_def_cfa_offset 16
    Ltmp18:
        .cfi_offset %rbp, -16
        movq    %rsp, %rbp
    Ltmp19:
        .cfi_def_cfa_register %rbp
        movq    %rdi, -8(%rbp)
        popq    %rbp
        retq
        .cfi_endproc
    
    
    .subsections_via_symbols
  • 相关阅读:
    朴素贝叶斯估计
    k临近法的实现:kd树
    感知机学习算法
    Logistic回归的牛顿法及DFP、BFGS拟牛顿法求解
    Logistic回归
    线性回归的梯度下降和正规方程组求解
    Redis学习笔记(8)-发布/订阅
    Redis学习笔记(7)-事务
    Redis学习笔记(6)-SortedSet
    Redis学习笔记(5)-Set
  • 原文地址:https://www.cnblogs.com/xiezhw3/p/3991597.html
Copyright © 2020-2023  润新知