- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
UnsafeCell
documentation说
The
UnsafeCell<T>
type is the only legal way to obtain aliasable data that is considered mutable.
唯一的构造方法是:
pub const fn new(value: T) -> UnsafeCell<T>
但是,不可能创建 c_void
, 我们只能创建 *mut c_void
或 *const c_void
.
是否可以创建UnsafeCell<c_void>
来自*mut c_void
?有了这个,我们可以让编译器知道指针可以指向可变的东西。
或者这是没有必要的?我们可以一直使用*mut c_void
吗?即使我们知道某些 FFI 调用会改变它指向的数据,而且我们有多个对它的引用?
一个用例是:
struct FFIStruct { v: UnsafeCell<c_void>, other_fields: ... }
impl FFIStruct {
// We don't want to require &mut self, as we
// are sure private call_ffi() will always be called
// sequentially, and we don't want to stop
// status() being callable during the call
fn call_ffi(&self){ ffi_function(self.v.get()) }
pub fn status(&self) -> FFIStatus { ... }
}
现在我们如何创建FFIStruct
?或者只使用 *mut c_void
会好吗?
&Cell<c_void>
的示例代码需要 #![feature(as_cell)]
:
unsafe fn get_cell<'a>(p: *mut c_void) -> &'a Cell<c_void> {
Cell::from_mut(&mut *p)
}
最佳答案
TL;DR:只需使用 *mut Foo
。这里不需要任何类型的细胞。
免责声明:目前还没有正式的 Rust 内存模型。
你不能创建这个类型,period,因为你不能1创建c_void
的实例。
事实是,您不需要创建这样的类型。 Aliasing is not spatial but temporal .您可以有多个 *mut T
指向同一个地方,这并不重要,直到您尝试访问一个。这实质上将其转换为引用,并且在该引用存在时需要坚持别名要求。
raw pointers fall outside of Rust's safe memory model.
Different from references and smart pointers, raw pointers:
- Are allowed to ignore the borrowing rules by having both immutable and mutable pointers or multiple mutable pointers to the same location
- Aren’t guaranteed to point to valid memory
- Are allowed to be null
- Don’t implement any automatic cleanup
另见:
1 从技术上讲,您可以,但这只是因为实现和向后兼容性限制。
关于rust - 如何安全地创建 UnsafeCell<c_void>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52601731/
UnsafeCell documentation说 The UnsafeCell type is the only legal way to obtain aliasable data that is
创建常规盒装切片(即 Box )的推荐方法似乎是先创建一个 std::Vec ,并使用 .into_boxed_slice() .但是,如果我希望将切片包装在 UnsafeCell 中,则与此类似的任
recent question正在寻找构建自我参照结构的能力。在讨论问题的可能答案时,一个可能的答案涉及使用 UnsafeCell 用于内部可变性,然后通过 transmute “丢弃”可变性. 这是
我是一名优秀的程序员,十分优秀!