本文簡要介紹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
附加到並取消引用它是未定義的行為,除非x
和y
指向同一個分配的對象。
與 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 pointer.wrapping_add用法及代碼示例
- Rust pointer.wrapping_sub用法及代碼示例
- Rust pointer.offset_from用法及代碼示例
- Rust pointer.is_null用法及代碼示例
- Rust pointer.add用法及代碼示例
- Rust pointer.get_unchecked用法及代碼示例
- Rust pointer.align_offset用法及代碼示例
- Rust pointer.as_uninit_ref用法及代碼示例
- Rust pointer.len用法及代碼示例
- Rust pointer.get_unchecked_mut用法及代碼示例
- Rust pointer.sub用法及代碼示例
- Rust pointer.set_ptr_value用法及代碼示例
- Rust pointer.as_ptr用法及代碼示例
- Rust pointer.as_mut_ptr用法及代碼示例
- Rust pointer.offset用法及代碼示例
- Rust pointer.as_mut用法及代碼示例
- Rust pointer.as_ref用法及代碼示例
- Rust pointer用法及代碼示例
- Rust poll_fn用法及代碼示例
- Rust park用法及代碼示例
- Rust panicking用法及代碼示例
- Rust panic用法及代碼示例
- Rust println用法及代碼示例
- Rust pending用法及代碼示例
- Rust print用法及代碼示例
注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 pointer.wrapping_offset。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。