函数或方法如:
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 语句并跳过函数的其余部分。
如果不是,则执行函数体的其余部分(取决于函数体)。