Function std::ptr::write_volatile

1.9.0 · source ·
pub unsafe fn write_volatile<T>(dst: *mut T, src: T)
Expand description

使用给定值对存储单元执行易失性写操作,而无需读取或丢弃旧值。

易失性操作旨在作用于 I/O 存储器,并保证编译器不会在其他易失性操作中对易失性操作进行清除或重新排序。

write_volatile 不会丢弃 dst 的内容。这是安全的,但可能会泄漏分配或资源,因此应注意不要覆盖应丢弃的对象。

此外,它不会丢弃 src。在语义上,src 被移到 dst 指向的位置。

Notes

Rust 当前没有严格和正式定义的内存模型,因此 “volatile” 此处所指的确切语义会随时间而变化。 话虽如此,其语义几乎总是以与 C11 对 volatile 的定义 相似的方式结束。

编译器不应更改易失性存储器操作的相对顺序或数量。 但是,零大小类型 (例如,如果将零大小类型传递给 write_volatile) 上的易失性存储器操作为无操作,可以忽略。

Safety

如果违反以下任一条件,则行为是未定义的:

  • dst 必须是 有效的 才能写入。

  • dst 必须正确对齐。

请注意,即使 T 的大小为 0,指针也必须非空且正确对齐。

就像在 C 语言中一样,操作是否易失性与涉及从多个线程进行并发访问的问题无关。在这方面,易失性访问的行为与非原子访问完全相同。

特别是,write_volatile 与同一位置上的任何其他操作 (读取或写入) 之间的争夺是未定义的行为。

Examples

基本用法:

let mut x = 0;
let y = &mut x as *mut i32;
let z = 12;

unsafe {
    std::ptr::write_volatile(y, z);
    assert_eq!(std::ptr::read_volatile(y), 12);
}
Run