25 个版本

0.6.1 2024 年 6 月 6 日
0.5.4 2024 年 4 月 26 日
0.5.2 2024 年 3 月 22 日
0.5.1 2023 年 6 月 24 日
0.2.0 2016 年 11 月 4 日

#69Rust 模式

Download history 15579/week @ 2024-05-02 18312/week @ 2024-05-09 17219/week @ 2024-05-16 16250/week @ 2024-05-23 15786/week @ 2024-05-30 14612/week @ 2024-06-06 17550/week @ 2024-06-13 17850/week @ 2024-06-20 19487/week @ 2024-06-27 13536/week @ 2024-07-04 18229/week @ 2024-07-11 18218/week @ 2024-07-18 19669/week @ 2024-07-25 16987/week @ 2024-08-01 21695/week @ 2024-08-08 19415/week @ 2024-08-15

81,002 每月下载量
用于 97 个 crate(26 个直接使用)

MIT/Apache

57KB
800

volatile

Build Status Docs.rs Badge

为原始指针提供易失性包装类型。

此 crate 中的易失性包装类型封装了任何可复制的类型的指针,并提供对封装值的易失性内存访问。易失性内存访问永远不会被编译器优化掉,并且在许多底层系统编程和并发环境中非常有用。

此 crate 提供了两种不同的包装类型:VolatilePtrVolatileRef。这两种类型之间的区别在于前者表现得像一个原始指针,而后者表现得像一个 Rust 引用类型。例如,VolatilePtr 可以自由复制,但不能跨线程发送,因为这可能会引入可变别名。另一方面,VolatileRef 类型需要独占访问才能进行修改,因此跨线程边界共享它是安全的。

这两种包装类型 强制执行任何原子性保证;要获得原子性,请考虑查看 libcorelibstd 中找到的 Atomic 包装类型。

为什么没有 VolatileCell

许多人表达了对VolatileCell类型的兴趣,即一种透明包装类型,拥有被包装的值。这种类型类似于core::cell::Cell,区别在于所有方法都是易变的。不幸的是,在Rust中实现这样的VolatileCell类型并不可行。原因是Rust和LLVM都将&&mut引用视为可解引用的。这意味着编译器可以不受任何限制地自由访问引用的值。因此,无论如何实现VolatileCell类型,编译器都可以执行对包含值的非易变读操作,这可能导致意外的(甚至未定义的?)行为。更多详情请见我们仓库中的讨论[链接]在unsafe-code-guidelines仓库中的讨论

许可证

许可协议为以下之一:

您可以选择其中之一。

除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交的任何贡献,均将按照上述方式双重许可,不附加任何额外条款或条件。

依赖项

~115KB