编译器是否将跳过检查移至函数调用之外?

问题描述 投票:0回答:2

函数或方法如:

void DoSomething(...){

  if( ... ) return;

  ...
}

检查如果满足条件则跳过整个函数。编译器是否将检查代码移到函数/方法之外以避免无用的函数调用?

c++ optimization
2个回答
1
投票

这取决于编译器。使用 -O3 上的 gcc 时,调用将被忽略。

为了尝试它,我写道:

int g;                                       

int dosomething(int x) {                     
    if (x == 0) return g;                    

    int y = 0;                               
    for (int i = 0; i < x; i++)              
        y += i;                              
    return y;                                
}                                            

int docall() {                               
    return dosomething(0);                   
} 

(有一个全局变量可以确保最后一次调用不会被轻视 优化)使用 -s 但没有 O 标志进行编译我在汇编器中得到了这个:

_Z6docallv:
.LFB1:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    movl    $0, %edi
    call    _Z11dosomethingi
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret

有一个完整的调用以 0 作为参数执行某些操作,而使用 -O3 我得到:

_Z6docallv:
.LFB1:
    .cfi_startproc
    movl    g(%rip), %eax
    ret

因此它返回 dosomething 的默认值而不调用它。


-2
投票

如果满足

if
条件,则将执行 return 语句并跳过函数的其余部分。 如果不是,则执行函数体的其余部分(取决于函数体)。

© www.soinside.com 2019 - 2024. All rights reserved.