gpt4 book ai didi

c - 如果 if 语句返回相同的内容,C 编译器是否会合并它们?

转载 作者:行者123 更新时间:2023-11-30 19:14:18 26 4
gpt4 key购买 nike

我试图了解编译器如何优化返回相同值的两个 if 语句。考虑函数顶部的以下代码:

if (some_ptr == NULL) {
return -1;
}

if (some_other_ptr == NULL) {
return -1;
}

将两个 if 语句合并为一个检查,相当于:

if (some_ptr == NULL || some_other_ptr == NULL) {
return -1;
}

最佳答案

虽然注释强调此行为依赖于编译器实现,但查看特定编译器有助于理解这一点。

使用测试程序:

int main(int argc, char *argv[]) {
srand(time(NULL));

char *some_ptr = (char *) rand();
char *some_other_ptr = (char *) rand();

if (some_ptr == NULL) {
return -1;
}

if (some_other_ptr == NULL) {
return -1;
}

return 0;
}

在我的运行 OS X 的笔记本电脑上使用 clang,没有优化(-O0 标志),程序集输出紧密遵循输入代码,没有快捷方式。

    movslq  %eax, %rcx
movq %rcx, -32(%rbp)
cmpq $0, -24(%rbp)
jne LBB0_2
## BB#1:
movl $-1, -4(%rbp)
jmp LBB0_5
LBB0_2:
cmpq $0, -32(%rbp)
jne LBB0_4
## BB#3:
movl $-1, -4(%rbp)
jmp LBB0_5
LBB0_4:
movl $0, -4(%rbp)
LBB0_5:
movl -4(%rbp), %eax
addq $32, %rsp
popq %rbp
retq
.cfi_endproc

但是使用最高优化(-O3 标志)进行编译会产生一些不同的代码。

    movl    %eax, %ecx
movl $-1, %eax
testl %ebx, %ebx
je LBB0_2
## BB#1:
cmpl $1, %ecx
sbbl %eax, %eax
LBB0_2:
addq $8, %rsp
popq %rbx
popq %rbp
retq
.cfi_endprocemphasized text

无论哪种情况,对于我的 clang 版本,编译器都不会将两个 bool 结果放在一起,即使在优化的代码中,也会通过 teSTL 进行两次比较和 cmpl 指令。

如果您愿意,您可以编写一个具有此行为的编译器!

关于c - 如果 if 语句返回相同的内容,C 编译器是否会合并它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34274712/

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