當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。