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


Rust pointer.wrapping_offset用法及代碼示例


本文簡要介紹rust語言中 pointer.wrapping_offset 的用法。

用法

pub fn wrapping_offset(self, count: isize) -> *const T

使用環繞算法計算指針的偏移量。

count以T為單位;例如,count 為 3 表示 3 * size_of::<T>() 字節的指針偏移量。

安全性

這個操作本身總是安全的,但使用結果指針卻不是。

結果指針“remembers”self指向的allocated object;它不能用於讀取或寫入其他分配的對象。

換一種說法,let z = x.wrapping_offset((y as isize) - (x as isize))不是製作z一樣y即使我們假設T有大小1並且沒有溢出:z仍然附著在對象上x附加到並取消引用它是未定義的行為,除非xy指向同一個分配的對象。

offset 相比,此方法本質上延遲了留在同一分配對象內的要求:offset 在跨越對象邊界時立即出現未定義行為; wrapping_offset 會生成一個指針,但如果在超出其所附加的對象的範圍時取消引用指針,則仍會導致未定義行為。 offset 可以更好地優化,因此更適合性能敏感的代碼。

延遲檢查僅考慮被取消引用的指針的值,而不考慮在計算最終結果期間使用的中間值。例如,x.wrapping_offset(o).wrapping_offset(o.wrapping_neg()) 始終與 x 相同。換句話說,允許離開分配的對象,然後再重新進入它。

例子

基本用法:

// Iterate using a raw pointer in increments of two elements
let data = [1u8, 2, 3, 4, 5];
let mut ptr: *const u8 = data.as_ptr();
let step = 2;
let end_rounded_up = ptr.wrapping_offset(6);

// This loop prints "1, 3, 5, "
while ptr != end_rounded_up {
    unsafe {
        print!("{}, ", *ptr);
    }
    ptr = ptr.wrapping_offset(step);
}

相關用法


注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 pointer.wrapping_offset。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。