基于函数调用的条件常量定义



我想用 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
}
}

目前,您无法基于函数调用定义conststatic值。这需要完成 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!到代码中。

最新更新