为了账号安全,请及时绑定邮箱和手机立即绑定

关于编译型语言代码优化的一点迷思

标签:
Java

最近经常看见一些人分享自己撸码的经验,比如曾经习惯把if语句改成三目运算符,以减少代码行数。现在习惯把相同的if判断合并在一起,以减少if判断的次数,提高效率。

多年以前笔者也是这样想的,但是随着年龄的增长,窃以为在编译型语言中,这样做的意义并不大,而且有时甚至可能会降低代码可读性。

例子

有如下两份代码:

#include <array>#include <iostream>int main(){    std::array<int, 122> array{ 2700, 2314, 8429, 7726, 4817, 8716, 3598, 6255, 5056, 8653, 8571, 5028, 1259, 3315,                                2896, 1411, 3847, 879,  7353, 8056, 8765, 2344, 6349, 4156, 8350, 4164, 4783, 6800,                                8887, 267,  4478, 6327, 58,   7961, 756,  5654, 9546, 5132, 247,  5514, 7098, 1156,                                795,  2502, 367,  5330, 2261, 8692, 2460, 4823, 8968, 4976, 1929, 1051, 9249, 9713,                                2803, 1743, 3681, 93,   4967, 2245, 198,  896,  6372, 4413, 2615, 6130, 5766, 5306,                                1236, 888,  8050, 7080, 3460, 3473, 1720, 3913, 3449, 8420, 1814, 1261, 1368, 167,                                7938, 4483, 4843, 4682, 3301, 4038, 709,  8655, 598,  3857, 6285, 2961, 6817, 1031,                                4007, 1392, 5717, 5837, 5695, 9511, 8891, 7883, 7035, 2349, 5752, 3139, 2442, 3966,                                2007, 9205, 8434, 5065, 3795, 6890, 2715, 1,    5106, 5083 };    auto x = 5330;    for (const auto &element : array)
    {        if (element > 1000)
        {            std::cout << "";
        }
    }    for (const auto &element : array)
    {        if (element > 1000)
        {            if (element == x)
            {                std::cout << "hello, world" << std::endl;
            }
        }
    }    return 0;
}
#include <array>#include <iostream>int main(){    std::array<int, 122> array{ 2700, 2314, 8429, 7726, 4817, 8716, 3598, 6255, 5056, 8653, 8571, 5028, 1259, 3315,                                2896, 1411, 3847, 879,  7353, 8056, 8765, 2344, 6349, 4156, 8350, 4164, 4783, 6800,                                8887, 267,  4478, 6327, 58,   7961, 756,  5654, 9546, 5132, 247,  5514, 7098, 1156,                                795,  2502, 367,  5330, 2261, 8692, 2460, 4823, 8968, 4976, 1929, 1051, 9249, 9713,                                2803, 1743, 3681, 93,   4967, 2245, 198,  896,  6372, 4413, 2615, 6130, 5766, 5306,                                1236, 888,  8050, 7080, 3460, 3473, 1720, 3913, 3449, 8420, 1814, 1261, 1368, 167,                                7938, 4483, 4843, 4682, 3301, 4038, 709,  8655, 598,  3857, 6285, 2961, 6817, 1031,                                4007, 1392, 5717, 5837, 5695, 9511, 8891, 7883, 7035, 2349, 5752, 3139, 2442, 3966,                                2007, 9205, 8434, 5065, 3795, 6890, 2715, 1,    5106, 5083 };    auto x = 5330;    for (const auto &element : array)
    {        if (element > 1000)
        {            std::cout << "";            if (element == x)
            {                std::cout << "hello, world" << std::endl;
            }
        }
    }    return 0;
}

从代码角度看第二份代码应该优于第一份代码。

使用LLVM生成两份代码的对应汇编如下:

    .section    __TEXT,__text,regular,pure_instructions
    .macosx_version_min 10, 13
    .globl  _main                   ## -- Begin function main
    .p2align    4, 0x90_main:                                  ## @main
    .cfi_startproc## BB#0:
    pushq   %rbpLcfi0:
    .cfi_def_cfa_offset 16Lcfi1:
    .cfi_offset %rbp, -16
    movq    %rsp, %rbpLcfi2:
    .cfi_def_cfa_register %rbp
    subq    $640, %rsp              ## imm = 0x280
    leaq    -544(%rbp), %rax
    leaq    l__ZZ4mainE5array(%rip), %rcx
    movl    $488, %edx              ## imm = 0x1E8
                                        ## kill: %RDX<def> %EDX<kill>
    movl    $0, -52(%rbp)
    movq    %rax, %rsi
    movq    %rsi, %rdi
    movq    %rcx, %rsi
    movq    %rax, -624(%rbp)        ## 8-byte Spill
    callq   _memcpy
    movl    $5330, -548(%rbp)       ## imm = 0x14D2
    movq    -624(%rbp), %rax        ## 8-byte Reload
    movq    %rax, -560(%rbp)
    movq    -560(%rbp), %rcx
    movq    %rcx, -48(%rbp)
    movq    -48(%rbp), %rcx
    movq    %rcx, -568(%rbp)
    movq    -560(%rbp), %rcx
    movq    %rcx, -24(%rbp)
    movq    -24(%rbp), %rcx
    addq    $488, %rcx              ## imm = 0x1E8
    movq    %rcx, -576(%rbp)LBB0_1:                                 ## =>This Inner Loop Header: Depth=1
    movq    -568(%rbp), %rax
    cmpq    -576(%rbp), %rax
    je  LBB0_6## BB#2:                                ##   in Loop: Header=BB0_1 Depth=1
    movq    -568(%rbp), %rax
    movq    %rax, -584(%rbp)
    movq    -584(%rbp), %rax
    cmpl    $1000, (%rax)           ## imm = 0x3E8
    jle LBB0_4## BB#3:                                ##   in Loop: Header=BB0_1 Depth=1
    movq    __ZNSt3__14coutE@GOTPCREL(%rip), %rdi
    leaq    L_.str(%rip), %rsi
    callq   __ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc
    movq    %rax, -632(%rbp)        ## 8-byte SpillLBB0_4:                                 ##   in Loop: Header=BB0_1 Depth=1
    jmp LBB0_5LBB0_5:                                 ##   in Loop: Header=BB0_1 Depth=1
    movq    -568(%rbp), %rax
    addq    $4, %rax
    movq    %rax, -568(%rbp)
    jmp LBB0_1LBB0_6:
    leaq    -544(%rbp), %rax
    movq    %rax, -592(%rbp)
    movq    -592(%rbp), %rax
    movq    %rax, -16(%rbp)
    movq    -16(%rbp), %rax
    movq    %rax, -600(%rbp)
    movq    -592(%rbp), %rax
    movq    %rax, -8(%rbp)
    movq    -8(%rbp), %rax
    addq    $488, %rax              ## imm = 0x1E8
    movq    %rax, -608(%rbp)LBB0_7:                                 ## =>This Inner Loop Header: Depth=1
    movq    -600(%rbp), %rax
    cmpq    -608(%rbp), %rax
    je  LBB0_14## BB#8:                                ##   in Loop: Header=BB0_7 Depth=1
    movq    -600(%rbp), %rax
    movq    %rax, -616(%rbp)
    movq    -616(%rbp), %rax
    cmpl    $1000, (%rax)           ## imm = 0x3E8
    jle LBB0_12## BB#9:                                ##   in Loop: Header=BB0_7 Depth=1
    movq    -616(%rbp), %rax
    movl    (%rax), %ecx
    cmpl    -548(%rbp), %ecx
    jne LBB0_11## BB#10:                               ##   in Loop: Header=BB0_7 Depth=1
    movq    __ZNSt3__14coutE@GOTPCREL(%rip), %rdi
    leaq    L_.str.1(%rip), %rsi
    callq   __ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc
    leaq    __ZNSt3__14endlIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_(%rip), %rsi
    movq    %rax, -32(%rbp)
    movq    %rsi, -40(%rbp)
    movq    -32(%rbp), %rdi
    callq   *-40(%rbp)
    movq    %rax, -640(%rbp)        ## 8-byte SpillLBB0_11:                                ##   in Loop: Header=BB0_7 Depth=1
    jmp LBB0_12LBB0_12:                                ##   in Loop: Header=BB0_7 Depth=1
    jmp LBB0_13LBB0_13:                                ##   in Loop: Header=BB0_7 Depth=1
    movq    -600(%rbp), %rax
    addq    $4, %rax
    movq    %rax, -600(%rbp)
    jmp LBB0_7LBB0_14:
    xorl    %eax, %eax
    addq    $640, %rsp              ## imm = 0x280
    popq    %rbp
    retq
    .cfi_endproc                                        ## -- End function
    .globl  __ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc ## -- Begin function _ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc
    .weak_definition    __ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc
    .p2align    4, 0x90__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc: ## @_ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc
    .cfi_startproc## BB#0:
    pushq   %rbpLcfi3:
    .cfi_def_cfa_offset 16Lcfi4:
    .cfi_offset %rbp, -16
    movq    %rsp, %rbpLcfi5:
    .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                                        ## -- End function
    .private_extern __ZNSt3__14endlIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_ ## -- Begin function _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_
    .p2align    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   %rbpLcfi6:
    .cfi_def_cfa_offset 16Lcfi7:
    .cfi_offset %rbp, -16
    movq    %rsp, %rbpLcfi8:
    .cfi_def_cfa_register %rbp
    subq    $144, %rsp
    movq    %rdi, -72(%rbp)
    movq    -72(%rbp), %rdi
    movq    (%rdi), %rax
    movq    -24(%rax), %rax
    movq    %rdi, %rcx
    addq    %rax, %rcx
    movq    %rcx, -32(%rbp)
    movb    $10, -33(%rbp)
    movq    -32(%rbp), %rsi
    leaq    -48(%rbp), %rax
    movq    %rdi, -80(%rbp)         ## 8-byte Spill
    movq    %rax, %rdi
    movq    %rax, -88(%rbp)         ## 8-byte Spill
    callq   __ZNKSt3__18ios_base6getlocEv
    movq    -88(%rbp), %rax         ## 8-byte Reload
    movq    %rax, -24(%rbp)
    movq    -24(%rbp), %rdiLtmp0:
    movq    __ZNSt3__15ctypeIcE2idE@GOTPCREL(%rip), %rsi
    callq   __ZNKSt3__16locale9use_facetERNS0_2idELtmp1:
    movq    %rax, -96(%rbp)         ## 8-byte Spill
    jmp LBB2_1LBB2_1:
    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), %ediLtmp2:
    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   *%rdxLtmp3:
    movb    %al, -113(%rbp)         ## 1-byte Spill
    jmp LBB2_3LBB2_2:Ltmp4:
    leaq    -48(%rbp), %rdi
    movl    %edx, %ecx
    movq    %rax, -56(%rbp)
    movl    %ecx, -60(%rbp)
    callq   __ZNSt3__16localeD1Ev
    movq    -56(%rbp), %rdi
    callq   __Unwind_ResumeLBB2_3:
    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
    retqLfunc_end0:
    .cfi_endproc
    .section    __TEXT,__gcc_except_tab
    .p2align    2GCC_except_table2:Lexception0:
    .byte   255                     ## @LPStart Encoding = omit
    .byte   155                     ## @TType Encoding = indirect pcrel sdata4
    .byte   41                      ## @TType base offset
    .byte   3                       ## Call site Encoding = udata4
    .byte   39                      ## Call site table lengthLset0 = Lfunc_begin0-Lfunc_begin0       ## >> Call Site 1 <<
    .long   Lset0Lset1 = Ltmp0-Lfunc_begin0              ##   Call between Lfunc_begin0 and Ltmp0
    .long   Lset1
    .long   0                       ##     has no landing pad
    .byte   0                       ##   On action: cleanupLset2 = Ltmp0-Lfunc_begin0              ## >> Call Site 2 <<
    .long   Lset2
Lset3 = Ltmp3-Ltmp0                     ##   Call between Ltmp0 and Ltmp3
    .long   Lset3
Lset4 = Ltmp4-Lfunc_begin0              ##     jumps to Ltmp4
    .long   Lset4
    .byte   0                       ##   On action: cleanupLset5 = Ltmp3-Lfunc_begin0              ## >> Call Site 3 <<
    .long   Lset5
Lset6 = Lfunc_end0-Ltmp3                ##   Call between Ltmp3 and Lfunc_end0
    .long   Lset6
    .long   0                       ##     has no landing pad
    .byte   0                       ##   On action: cleanup
    .p2align    2
                                        ## -- End function
    .section    __TEXT,__text,regular,pure_instructions
    .globl  __ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m ## -- Begin function _ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m
    .weak_definition    __ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m
    .p2align    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_mLfunc_begin1:
    .cfi_startproc
    .cfi_personality 155, ___gxx_personality_v0
    .cfi_lsda 16, Lexception1## BB#0:
    pushq   %rbpLcfi9:
    .cfi_def_cfa_offset 16Lcfi10:
    .cfi_offset %rbp, -16
    movq    %rsp, %rbpLcfi11:
    .cfi_def_cfa_register %rbp
    subq    $384, %rsp              ## imm = 0x180
    movq    %rdi, -184(%rbp)
    movq    %rsi, -192(%rbp)
    movq    %rdx, -200(%rbp)
    movq    -184(%rbp), %rsiLtmp5:
    leaq    -216(%rbp), %rdi
    callq   __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryC1ERS3_Ltmp6:
    jmp LBB3_1LBB3_1:
    leaq    -216(%rbp), %rax
    movq    %rax, -176(%rbp)
    movq    -176(%rbp), %rax
    movb    (%rax), %cl
    movb    %cl, -249(%rbp)         ## 1-byte Spill## BB#2:
    movb    -249(%rbp), %al         ## 1-byte Reload
    testb   $1, %al
    jne LBB3_3
    jmp LBB3_26LBB3_3:
    leaq    -248(%rbp), %rax
    movq    -184(%rbp), %rcx
    movq    %rax, -160(%rbp)
    movq    %rcx, -168(%rbp)
    movq    -160(%rbp), %rax
    movq    -168(%rbp), %rcx
    movq    %rax, -144(%rbp)
    movq    %rcx, -152(%rbp)
    movq    -144(%rbp), %rax
    movq    -152(%rbp), %rcx
    movq    (%rcx), %rdx
    movq    -24(%rdx), %rdx
    addq    %rdx, %rcx
    movq    %rcx, -136(%rbp)
    movq    -136(%rbp), %rcx
    movq    %rcx, -128(%rbp)
    movq    -128(%rbp), %rcx
    movq    40(%rcx), %rcx
    movq    %rcx, (%rax)
    movq    -192(%rbp), %rsi
    movq    -184(%rbp), %rax
    movq    (%rax), %rcx
    movq    -24(%rcx), %rcx
    addq    %rcx, %rax
    movq    %rax, -88(%rbp)
    movq    -88(%rbp), %rax
    movl    8(%rax), %edi
    movq    %rsi, -264(%rbp)        ## 8-byte Spill
    movl    %edi, -268(%rbp)        ## 4-byte Spill## BB#4:
    movl    -268(%rbp), %eax        ## 4-byte Reload
    andl    $176, %eax
    cmpl    $32, %eax
    jne LBB3_6## BB#5:
    movq    -192(%rbp), %rax
    addq    -200(%rbp), %rax
    movq    %rax, -280(%rbp)        ## 8-byte Spill
    jmp LBB3_7LBB3_6:
    movq    -192(%rbp), %rax
    movq    %rax, -280(%rbp)        ## 8-byte SpillLBB3_7:
    movq    -280(%rbp), %rax        ## 8-byte Reload
    movq    -192(%rbp), %rcx
    addq    -200(%rbp), %rcx
    movq    -184(%rbp), %rdx
    movq    (%rdx), %rsi
    movq    -24(%rsi), %rsi
    addq    %rsi, %rdx
    movq    -184(%rbp), %rsi
    movq    (%rsi), %rdi
    movq    -24(%rdi), %rdi
    addq    %rdi, %rsi
    movq    %rsi, -72(%rbp)
    movq    -72(%rbp), %rsi
    movq    %rax, -288(%rbp)        ## 8-byte Spill
    movq    %rcx, -296(%rbp)        ## 8-byte Spill
    movq    %rdx, -304(%rbp)        ## 8-byte Spill
    movq    %rsi, -312(%rbp)        ## 8-byte Spill
    callq   __ZNSt3__111char_traitsIcE3eofEv
    movq    -312(%rbp), %rcx        ## 8-byte Reload
    movl    144(%rcx), %esi
    movl    %eax, %edi
    callq   __ZNSt3__111char_traitsIcE11eq_int_typeEii
    testb   $1, %al
    jne LBB3_8
    jmp LBB3_13LBB3_8:
    movq    -312(%rbp), %rax        ## 8-byte Reload
    movq    %rax, -32(%rbp)
    movb    $32, -33(%rbp)
    movq    -32(%rbp), %rsiLtmp8:
    leaq    -48(%rbp), %rdi
    callq   __ZNKSt3__18ios_base6getlocEvLtmp9:
    jmp LBB3_9LBB3_9:
    leaq    -48(%rbp), %rax
    movq    %rax, -24(%rbp)
    movq    -24(%rbp), %rdiLtmp10:
    movq    __ZNSt3__15ctypeIcE2idE@GOTPCREL(%rip), %rsi
    callq   __ZNKSt3__16locale9use_facetERNS0_2idELtmp11:
    movq    %rax, -320(%rbp)        ## 8-byte Spill
    jmp LBB3_10LBB3_10:
    movb    -33(%rbp), %al
    movq    -320(%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), %ediLtmp12:
    movl    %edi, -324(%rbp)        ## 4-byte Spill
    movq    %rdx, %rdi
    movl    -324(%rbp), %r8d        ## 4-byte Reload
    movq    %rsi, -336(%rbp)        ## 8-byte Spill
    movl    %r8d, %esi
    movq    -336(%rbp), %rdx        ## 8-byte Reload
    callq   *%rdxLtmp13:
    movb    %al, -337(%rbp)         ## 1-byte Spill
    jmp LBB3_12LBB3_11:Ltmp14:
    movl    %edx, %ecx
    movq    %rax, -56(%rbp)
    movl    %ecx, -60(%rbp)
    leaq    -48(%rbp), %rdi
    callq   __ZNSt3__16localeD1Ev
    movq    -56(%rbp), %rax
    movl    -60(%rbp), %ecx
    movq    %rax, -352(%rbp)        ## 8-byte Spill
    movl    %ecx, -356(%rbp)        ## 4-byte Spill
    jmp LBB3_21LBB3_12:
    leaq    -48(%rbp), %rdi
    callq   __ZNSt3__16localeD1Ev
    movb    -337(%rbp), %al         ## 1-byte Reload
    movsbl  %al, %ecx
    movq    -312(%rbp), %rdi        ## 8-byte Reload
    movl    %ecx, 144(%rdi)LBB3_13:
    movq    -312(%rbp), %rax        ## 8-byte Reload
    movl    144(%rax), %ecx
    movb    %cl, %dl
    movb    %dl, -357(%rbp)         ## 1-byte Spill## BB#14:
    movq    -248(%rbp), %rdiLtmp15:
    movb    -357(%rbp), %al         ## 1-byte Reload
    movsbl  %al, %r9d
    movq    -264(%rbp), %rsi        ## 8-byte Reload
    movq    -288(%rbp), %rdx        ## 8-byte Reload
    movq    -296(%rbp), %rcx        ## 8-byte Reload
    movq    -304(%rbp), %r8         ## 8-byte Reload
    callq   __ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_Ltmp16:
    movq    %rax, -368(%rbp)        ## 8-byte Spill
    jmp LBB3_15LBB3_15:
    leaq    -240(%rbp), %rax
    movq    -368(%rbp), %rcx        ## 8-byte Reload
    movq    %rcx, -240(%rbp)
    movq    %rax, -80(%rbp)
    movq    -80(%rbp), %rax
    cmpq    $0, (%rax)
    jne LBB3_25## BB#16:
    movq    -184(%rbp), %rax
    movq    (%rax), %rcx
    movq    -24(%rcx), %rcx
    addq    %rcx, %rax
    movq    %rax, -112(%rbp)
    movl    $5, -116(%rbp)
    movq    -112(%rbp), %rax
    movl    -116(%rbp), %edx
    movq    %rax, -96(%rbp)
    movl    %edx, -100(%rbp)
    movq    -96(%rbp), %rax
    movl    32(%rax), %edx
    movl    -100(%rbp), %esi
    orl %esi, %edxLtmp17:
    movq    %rax, %rdi
    movl    %edx, %esi
    callq   __ZNSt3__18ios_base5clearEjLtmp18:
    jmp LBB3_17LBB3_17:
    jmp LBB3_18LBB3_18:
    jmp LBB3_25LBB3_19:Ltmp7:
    movl    %edx, %ecx
    movq    %rax, -224(%rbp)
    movl    %ecx, -228(%rbp)
    jmp LBB3_22LBB3_20:Ltmp19:
    movl    %edx, %ecx
    movq    %rax, -352(%rbp)        ## 8-byte Spill
    movl    %ecx, -356(%rbp)        ## 4-byte Spill
    jmp LBB3_21LBB3_21:
    movl    -356(%rbp), %eax        ## 4-byte Reload
    movq    -352(%rbp), %rcx        ## 8-byte Reload
    leaq    -216(%rbp), %rdi
    movq    %rcx, -224(%rbp)
    movl    %eax, -228(%rbp)
    callq   __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1EvLBB3_22:
    movq    -224(%rbp), %rdi
    callq   ___cxa_begin_catch
    movq    -184(%rbp), %rdi
    movq    (%rdi), %rcx
    movq    -24(%rcx), %rcx
    addq    %rcx, %rdiLtmp20:
    movq    %rax, -376(%rbp)        ## 8-byte Spill
    callq   __ZNSt3__18ios_base33__set_badbit_and_consider_rethrowEvLtmp21:
    jmp LBB3_23LBB3_23:
    callq   ___cxa_end_catchLBB3_24:
    movq    -184(%rbp), %rax
    addq    $384, %rsp              ## imm = 0x180
    popq    %rbp
    retqLBB3_25:
    jmp LBB3_26LBB3_26:
    leaq    -216(%rbp), %rdi
    callq   __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1Ev
    jmp LBB3_24LBB3_27:Ltmp22:
    movl    %edx, %ecx
    movq    %rax, -224(%rbp)
    movl    %ecx, -228(%rbp)Ltmp23:
    callq   ___cxa_end_catchLtmp24:
    jmp LBB3_28LBB3_28:
    jmp LBB3_29LBB3_29:
    movq    -224(%rbp), %rdi
    callq   __Unwind_ResumeLBB3_30:Ltmp25:
    movl    %edx, %ecx
    movq    %rax, %rdi
    movl    %ecx, -380(%rbp)        ## 4-byte Spill
    callq   ___clang_call_terminateLfunc_end1:
    .cfi_endproc
    .section    __TEXT,__gcc_except_tab
    .p2align    2GCC_except_table3:Lexception1:
    .byte   255                     ## @LPStart Encoding = omit
    .byte   155                     ## @TType Encoding = indirect pcrel sdata4
    .asciz  "\201\201\200\200"      ## @TType base offset
    .byte   3                       ## Call site Encoding = udata4
    .byte   117                     ## Call site table lengthLset7 = Ltmp5-Lfunc_begin1              ## >> Call Site 1 <<
    .long   Lset7
Lset8 = Ltmp6-Ltmp5                     ##   Call between Ltmp5 and Ltmp6
    .long   Lset8
Lset9 = Ltmp7-Lfunc_begin1              ##     jumps to Ltmp7
    .long   Lset9
    .byte   5                       ##   On action: 3Lset10 = Ltmp8-Lfunc_begin1             ## >> Call Site 2 <<
    .long   Lset10Lset11 = Ltmp9-Ltmp8                    ##   Call between Ltmp8 and Ltmp9
    .long   Lset11
Lset12 = Ltmp19-Lfunc_begin1            ##     jumps to Ltmp19
    .long   Lset12
    .byte   5                       ##   On action: 3Lset13 = Ltmp10-Lfunc_begin1            ## >> Call Site 3 <<
    .long   Lset13
Lset14 = Ltmp13-Ltmp10                  ##   Call between Ltmp10 and Ltmp13
    .long   Lset14
Lset15 = Ltmp14-Lfunc_begin1            ##     jumps to Ltmp14
    .long   Lset15
    .byte   3                       ##   On action: 2Lset16 = Ltmp15-Lfunc_begin1            ## >> Call Site 4 <<
    .long   Lset16
Lset17 = Ltmp18-Ltmp15                  ##   Call between Ltmp15 and Ltmp18
    .long   Lset17
Lset18 = Ltmp19-Lfunc_begin1            ##     jumps to Ltmp19
    .long   Lset18
    .byte   5                       ##   On action: 3Lset19 = Ltmp18-Lfunc_begin1            ## >> Call Site 5 <<
    .long   Lset19
Lset20 = Ltmp20-Ltmp18                  ##   Call between Ltmp18 and Ltmp20
    .long   Lset20
    .long   0                       ##     has no landing pad
    .byte   0                       ##   On action: cleanupLset21 = Ltmp20-Lfunc_begin1            ## >> Call Site 6 <<
    .long   Lset21
Lset22 = Ltmp21-Ltmp20                  ##   Call between Ltmp20 and Ltmp21
    .long   Lset22
Lset23 = Ltmp22-Lfunc_begin1            ##     jumps to Ltmp22
    .long   Lset23
    .byte   0                       ##   On action: cleanupLset24 = Ltmp21-Lfunc_begin1            ## >> Call Site 7 <<
    .long   Lset24
Lset25 = Ltmp23-Ltmp21                  ##   Call between Ltmp21 and Ltmp23
    .long   Lset25
    .long   0                       ##     has no landing pad
    .byte   0                       ##   On action: cleanupLset26 = Ltmp23-Lfunc_begin1            ## >> Call Site 8 <<
    .long   Lset26
Lset27 = Ltmp24-Ltmp23                  ##   Call between Ltmp23 and Ltmp24
    .long   Lset27
Lset28 = Ltmp25-Lfunc_begin1            ##     jumps to Ltmp25
    .long   Lset28
    .byte   5                       ##   On action: 3Lset29 = Ltmp24-Lfunc_begin1            ## >> Call Site 9 <<
    .long   Lset29
Lset30 = Lfunc_end1-Ltmp24              ##   Call between Ltmp24 and Lfunc_end1
    .long   Lset30
    .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
                                        ## >> Catch TypeInfos <<
    .long   0                       ## TypeInfo 1
    .p2align    2
                                        ## -- End function



作者:0x11901
链接:https://www.jianshu.com/p/4a1b682158d4


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消