繁体   English   中英

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

[英]Does compilers move skip checks to outside the function call?

函数或方法如下:

void DoSomething(...){

  if( ... ) return;

  ...
}

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

这取决于编译器。 在-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的默认值而不调用它。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM