我想在我的代码中将一些影响性能的函数调用放在功能门之后。如果未启用该功能,我正在考虑只实现该功能的空实现。这样,希望 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() 为空,对 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
,循环将被完全删除。
无论如何:是,优化器将删除空函数!
关于optimization - 在 Rust 中空函数会被优化掉吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43233804/