我正在尝试编写 Rust 绑定 C 集合库(Judy Arrays [1]),该库只提供了存储指针宽度值的空间。我的公司有相当多的现有代码,使用这个空间直接存储非指针值,例如指针宽度整数和小结构体。我希望我的 Rust 绑定能够使用泛型实现安全访问此类集合,但是在正确处理指针隐藏语义方面遇到了困难。
我已经使用
示例代码:
有没有更好的方法来处理这个问题?或者说,这种运行时检查是Rust 1.0支持的最佳方式吗?
(相关问题,请参见此处,解释为什么我不使用
[1] 我知道已经存在rust-judy项目,但它不支持我想要的指针存储方式,而且我编写这些新绑定主要是作为学习练习。
我已经使用
std::mem::transmute_copy()
实现了基本接口来存储该值,但是该函数明确没有做任何事情来确保源类型和目标类型具有相同的大小。我能够通过断言验证集合类型参数在运行时具有兼容的大小,但我真的希望检查能够在编译时进行。示例代码:
pub struct Example<T> {
v: usize,
t: PhantomData<T>,
}
impl<T> Example<T> {
pub fn new() -> Example<T> {
assert!(mem::size_of::<usize>() == mem::size_of::<T>());
Example { v: 0, t: PhantomData }
}
pub fn insert(&mut self, val: T) {
unsafe {
self.v = mem::transmute_copy(&val);
mem::forget(val);
}
}
}
有没有更好的方法来处理这个问题?或者说,这种运行时检查是Rust 1.0支持的最佳方式吗?
(相关问题,请参见此处,解释为什么我不使用
mem::transmute()
。)[1] 我知道已经存在rust-judy项目,但它不支持我想要的指针存储方式,而且我编写这些新绑定主要是作为学习练习。
val
的第一个单词并将其存储在 v 中。哦,如果你想要存储一个指针,请存储指向实际存在的东西的指针,比如指向Box<T>
中的T
的指针。 - blussval
的类型恰好是一个单词大小,我想要复制出val
的第一个单词。这里的目标是使用以这种方式存储的数据与现有的C代码进行FFI交互。 - llasramT
的大小进行一般性的限制。然而,断言当然是单态化并在编译时编译的,因此至少没有开销。 - blussassert!
在编译时被解析为无操作或panic!
的观点很好。如果这种运行时检查实际上是Rust 1.0能做到的最好的,我会接受它作为答案! - llasramassert!
的#[test]
。 - porglezomp