最近经常看见一些人分享自己撸码的经验,比如曾经习惯把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
随时随地看视频