我编写了一个简单的 C++ 函数来检查编译器优化:
bool f1(bool a, bool b) {
return !a || (a && b);
}
之后我检查了 Rust 中的等价物:
fn f1(a: bool, b: bool) -> bool {
!a || (a && b)
}
我使用Godbolt检查汇编器输出。
C++ 代码(由带有 -O3 标志的 clang 编译)的结果如下:
f1(bool, bool): # @f1(bool, bool)
xor dil, 1
or dil, sil
mov eax, edi
ret
Rust 等价的结果要长得多:
example::f1:
push rbp
mov rbp, rsp
mov al, sil
mov cl, dil
mov dl, cl
xor dl, -1
test dl, 1
mov byte ptr [rbp - 3], al
mov byte ptr [rbp - 4], cl
jne .LBB0_1
jmp .LBB0_3
.LBB0_1:
mov byte ptr [rbp - 2], 1
jmp .LBB0_4
.LBB0_2:
mov byte ptr [rbp - 2], 0
jmp .LBB0_4
.LBB0_3:
mov al, byte ptr [rbp - 4]
test al, 1
jne .LBB0_7
jmp .LBB0_6
.LBB0_4:
mov al, byte ptr [rbp - 2]
and al, 1
movzx eax, al
pop rbp
ret
.LBB0_5:
mov byte ptr [rbp - 1], 1
jmp .LBB0_8
.LBB0_6:
mov byte ptr [rbp - 1], 0
jmp .LBB0_8
.LBB0_7:
mov al, byte ptr [rbp - 3]
test al, 1
jne .LBB0_5
jmp .LBB0_6
.LBB0_8:
test byte ptr [rbp - 1], 1
jne .LBB0_1
jmp .LBB0_2
我也尝试了-O
选项,但输出为空(删除了未使用的函数)。
我故意不使用任何库来保持输出干净。请注意两者clang
并rustc
使用 LLVM 作为后端。是什么解释了这种巨大的输出差异?如果它只是禁用优化开关问题,我怎样才能看到优化的输出rustc
?