我想在代码中的功能门后面放置一些影响函数调用的性能。如果该功能未启用,我想的是只是实现了该功能的空实现。这样,希望Rust编译器可以完全从函数中删除它。
这样的事情:
// Included if feature is enabled
fn foo() {
// ...
}
// Included if the feature is disabled
fn foo() {}
// Performance critical code
for i in 1..1000000000 {
// ...
foo();
}
如果foo()的调用是空的,它会被优化掉吗?
答案 0 :(得分:6)
只需在惊人的Compiler Explorer:)
中试一试您的示例的结果程序集是:
example::main:
push rbp
mov rbp, rsp
mov eax, 1
.LBB0_1:
xor ecx, ecx
cmp eax, 1000000000
setl cl
add ecx, eax
cmp eax, 1000000000
mov eax, ecx
jl .LBB0_1
pop rbp
ret
正如您所看到的,没有call
指令,并且根本没有调用foo()
。但是,您可能想知道为什么不删除循环,因为它对外界没有影响。我可以假设有时这些循环实际上用于在某种意义上浪费时间。如果将计数器减少到100
,则完全删除循环。
无论如何:是,优化器将删除空函数!
答案 1 :(得分:1)
根据我对当前稳定Rust的发布模式的检查,以下代码:
fn foo() {}
fn main() {
for _ in 1..1000000000 {
foo();
}
println!(); // a side effect so that the whole program is not optimized away
}
编译为同一个程序集,就好像循环为空:
for _ in 1..1000000000 {}