Function core::ptr::read_volatile

1.9.0 · source ·
pub unsafe fn read_volatile<T>(src: *const T) -> T
Expand description

src 的值进行易失性读取,而无需移动它。这将使 src 中的内存保持不变。

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

Notes

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

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

Safety

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

  • src 必须是 有效的 才能读取。

  • src 必须正确对齐。

  • src 必须指向 T 类型的正确初始化值。

read 一样,无论 T 是否为 Copyread_volatile 都会创建 T 的按位副本。 如果 T 不是 Copy,则同时使用返回值和 *src 处的值都可以 违反内存安全。 但是,几乎可以肯定地将非 Copy 类型存储在易失性存储器中。

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

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

特别是,read_volatile 与任何对同一位置的写操作之间的争夺是未定义的行为。

Examples

基本用法:

let x = 12;
let y = &x as *const i32;

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