我想在代码中的功能门后面放置一些影响性能的函数调用。如果未启用该功能,我正在考虑仅实现该功能的空实现。这样,希望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()的调用为空,会优化它吗?
只需在令人惊叹的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
,则循环将被完全删除。
无论如何:是的,优化器将删除空函数!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句