gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:03:26 26 4
gpt4 key购买 nike

函数或方法如:

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

有一个完整的调用 dosomething 以 0 作为参数,而使用 -O3 我得到:

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

所以它返回了 dosomething 的默认值而不调用它。

关于c++ - 编译器是否将跳过检查移到函数调用之外?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16751043/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com