[英]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.