gpt4 book ai didi

rust - 如何安全地创建 UnsafeCell

转载 作者:行者123 更新时间:2023-11-29 08:07:21 24 4
gpt4 key购买 nike

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.

The Rustonomicon

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

¸— The Rust Programming Language

另见:

1 从技术上讲,您可以,但这只是因为实现和向后兼容性限制。

关于rust - 如何安全地创建 UnsafeCell<c_void>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52601731/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com