当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust read_unaligned用法及代码示例


本文简要介绍rust语言中 Function std::ptr::read_unaligned 的用法。

用法

pub unsafe fn read_unaligned<T>(src: *const T) -> T

src 读取值而不移动它。这使src 中的内存保持不变。

read 不同,read_unaligned 适用于未对齐的指针。

安全性

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

  • src 必须是 valid 才能读取。

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

read 一样,read_unaligned 创建 T 的按位副本,无论 T 是否为 Copy 。如果 T 不是 Copy ,则同时使用返回值和 *src 处的值可以 violate memory safety

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

packed 结构上

尝试创建一个指向unaligned具有如下表达式的结构体字段&packed.unaligned as *const FieldType在将其转换为原始指针之前创建一个中间未对齐引用。该引用是临时的并且立即强制转换是无关紧要的,因为编译器始终期望引用正确对齐。结果,使用&packed.unaligned as *const FieldType立即引起未定义的行为在你的程序中。

相反,您必须使用 ptr::addr_of! 宏来创建指针。您可以将返回的指针与此函数一起使用。

不该做什么以及这与read_unaligned 有何关系的一个例子是:

#[repr(packed, C)]
struct Packed {
    _padding: u8,
    unaligned: u32,
}

let packed = Packed {
    _padding: 0x00,
    unaligned: 0x01020304,
};

// Take the address of a 32-bit integer which is not aligned.
// In contrast to `&packed.unaligned as *const _`, this has no undefined behavior.
let unaligned = std::ptr::addr_of!(packed.unaligned);

let v = unsafe { std::ptr::read_unaligned(unaligned) };
assert_eq!(v, 0x01020304);

直接使用例如访问未对齐的字段但是packed.unaligned 是安全的。

例子

从字节缓冲区中读取一个 usize 值:

use std::mem;

fn read_usize(x: &[u8]) -> usize {
    assert!(x.len() >= mem::size_of::<usize>());

    let ptr = x.as_ptr() as *const usize;

    unsafe { ptr.read_unaligned() }
}

相关用法


注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Function std::ptr::read_unaligned。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。