- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为 C 集合库 (Judy Arrays [1]) 编写 Rust 绑定(bind),它只为自己提供存储指针宽度值的空间。我的公司有相当多的现有代码使用这个空间来直接存储非指针值,例如指针宽度整数和小型结构。我希望我的 Rust 绑定(bind)允许使用泛型对此类集合进行类型安全访问,但我无法让指针存储语义正常工作。
mem::transmute()
函数似乎是实现所需行为的一种潜在工具,但尝试在参数化类型的实例上使用它会产生令我困惑的编译错误.
示例代码:
pub struct Example<T> {
v: usize,
t: PhantomData<T>,
}
impl<T> Example<T> {
pub fn new() -> Example<T> {
Example { v: 0, t: PhantomData }
}
pub fn insert(&mut self, val: T) {
unsafe {
self.v = mem::transmute(val);
}
}
}
产生的错误:
src/lib.rs:95:22: 95:36 error: cannot transmute to or from a type that contains type parameters in its interior [E0139]
src/lib.rs:95 self.v = mem::transmute(val);
^~~~~~~~~~~~~~
这是否意味着仅由参数组成的类型“在其内部包含类型参数”,因此 transmute()
在这里不起作用?对正确的方法有什么建议吗?
( Related question ,试图获得相同的结果,但不一定通过 mem::transmute()
。)
[1] 我知道现有的 rust-judy
项目,但它不支持我想要的指针存储,我编写这些新绑定(bind)主要是为了学习无论如何锻炼。
最佳答案
您可以将 &T
转换为 &usize
,而不是直接将 T
转换为 usize
:
pub fn insert(&mut self, val: T) {
unsafe {
let usize_ref: &usize = mem::transmute(&val);
self.v = *usize_ref;
}
}
请注意,如果 T
的大小小于 usize
的大小,或者如果对齐要求不同,这可能会从无效的内存位置读取。这可能会导致段错误。您可以添加一个断言来防止这种情况:
assert_eq!(mem::size_of::<T>(), mem::size_of::<usize>());
assert!(mem::align_of::<usize>() <= mem::align_of::<T>());
关于pointers - 通过 `mem::transmute()` 指针存储泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30328366/
我正在尝试使用 cargo build 构建一个 Rust 项目,但出现此错误: error[E0512]: transmute called with types of different size
这个问题在这里已经有了答案: Is there a way to make an immutable reference mutable? (2 个回答) Why is transmuting &T
我需要获得 4 行分组数据集的摘要(基本上是围绕数据框子集中的数据点集的正方形。 一个函数: myfun pb %>% group_by(Type,Sex) %>% transmute(F1=myf
我正在尝试为 C 集合库 (Judy Arrays [1]) 编写 Rust 绑定(bind),它只为自己提供存储指针宽度值的空间。我的公司有相当多的现有代码使用这个空间来直接存储非指针值,例如指针宽
我正在尝试寻找 Rust 内在函数的实现,尤其是接受一个参数的“transumte”内在函数。 我在 cast.rs 中看到了以下代码,但如您所见,它只是委托(delegate)给一些其他的 tran
transmute 安全吗?共享引用 &给力 Arc 进入共享引用 &到 Weak ? 换个方式问:下面是安全函数sound ,还是等待发生的漏洞? pub fn as_weak(strong: &'
我正在查看 this code这是一个非常简单的库,只有一个文件,主要是测试,所以它很短。我试图理解一个结构: pub struct ChallengeFields(HashMap, (String,
这是我使用 c2rust 生成的一些代码然后清理了一下: #![feature(libc)] extern crate libc; use libc::*; use std::mem::transmu
我是一名优秀的程序员,十分优秀!