本文簡要介紹rust語言中 pointer.offset
的用法。
用法
pub unsafe fn offset(self, count: isize) -> *const T
計算與指針的偏移量。
count
以T為單位;例如,count
為 3 表示 3 * size_of::<T>()
字節的指針偏移量。
安全性
如果違反以下任何條件,則結果為未定義行為:
-
起始指針和結果指針都必須位於同一 allocated object 的邊界內或超出末尾一個字節。
-
計算出的偏移量,以字節為單位,不能溢出
isize
. -
範圍內的偏移量不能依賴於“wrapping around” 地址空間。也就是說,以字節為單位的無限精度和必須適合使用大小。
編譯器和標準庫通常會嘗試確保分配永遠不會達到需要考慮偏移量的大小。例如,Vec
和 Box
確保它們分配的字節數永遠不會超過 isize::MAX
,因此 vec.as_ptr().add(vec.len())
始終是安全的。
大多數平台根本無法構建這樣的分配。例如,沒有已知的 64 位平台可以為 263由於page-table 限製或拆分地址空間而導致的字節數。但是,一些 32 位和 16 位平台可能會成功處理超過isize::MAX
字節與物理地址擴展之類的東西。因此,直接從分配器或內存映射文件獲取內存可能太大而無法處理此函數。
如果這些約束難以滿足,請考慮使用wrapping_offset
。此方法的唯一優點是它可以實現更積極的編譯器優化。
例子
基本用法:
let s: &str = "123";
let ptr: *const u8 = s.as_ptr();
unsafe {
println!("{}", *ptr.offset(1) as char);
println!("{}", *ptr.offset(2) as char);
}
相關用法
- Rust pointer.offset_from用法及代碼示例
- Rust pointer.is_null用法及代碼示例
- Rust pointer.add用法及代碼示例
- Rust pointer.get_unchecked用法及代碼示例
- Rust pointer.align_offset用法及代碼示例
- Rust pointer.wrapping_add用法及代碼示例
- Rust pointer.wrapping_offset用法及代碼示例
- Rust pointer.wrapping_sub用法及代碼示例
- 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.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.offset。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。