我想用 Rust 编写这段 C 代码:
#include <limits.h>
#if ((INT_MAX >> 15) >> 15) >= 1
#define LUAI_BITSINT 32
#else
/* 'int' always must have at least 16 bits */
#define LUAI_BITSINT 16
#endif
我可以创建一个返回BITSINT
的函数,但我想避免运行时成本。我不知道如何在 Rust 中的宏中表达isize::max_value()
,可以吗?
这将是我的运行时代码:
fn bitsint() -> usize {
if ((isize::max_value() >> 15) >> 15) >= 1 {
32
} else {
16
}
}
目前,您无法基于函数调用定义const
或static
值。这需要完成 const 函数功能。
话虽如此...
但我想避免运行时成本
tl;dr这里没有运行时成本,这很好。
若要避免运行时成本,应首先确保具有运行时成本。为了检查,我使用了以下代码:
#[inline(never)]
fn bitsint() -> usize {
if ((isize::max_value() >> 15) >> 15) >= 1 {
12345
} else {
67890
}
}
fn main() {
println!("{}", bitsint());
}
我切换了值,使其更容易在程序集中找到。生成的程序集没有函数bitsint
,即使我要求它不内联。很难阻止优化编译器!
在程序集的其余部分中,值甚至67890
甚至不会出现,即使12345
出现也是如此。
另一种解决方案可能是使用条件编译。举一个未经测试的例子:
#[cfg(target_pointer_width = "64")]
const LUAI_BITSINT: usize = 32;
#[cfg(not(target_pointer_width = "64"))]
const LUAI_BITSINT: usize = 16;
你也可以使用构建脚本根据你想要的任何条件生成 Rust 代码。这将创建一个常量,然后您可以将其include!
到代码中。