我编写了一个简单的 C++ 函数,以便检查编译器是否进行了优化:
bool f1(bool a, bool b) {
return !a || (a && b);
}
之后,我在 Rust 中检查了等效物:
fn f1(a: bool, b: bool) -> bool {
!a || (a && b)
}
我使用godbolt来检查汇编输出。
C++代码的结果(由clang编译并带有-O3标志)如下:
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
的优化输出呢?
-O
(在发布模式下)进行编译? - Boiethios