本文简要介绍rust语言中 pointer.wrapping_sub
的用法。
用法
pub fn wrapping_sub(self, count: usize) -> *const T
使用环绕算法计算指针的偏移量。 (方便 .wrapping_offset((count as isize).wrapping_neg())
)
count
以T为单位;例如,count
为 3 表示 3 * size_of::<T>()
字节的指针偏移量。
安全性
这个操作本身总是安全的,但使用结果指针却不是。
结果指针“remembers”self
指向的allocated object;它不能用于读取或写入其他分配的对象。
换一种说法,let z = x.wrapping_sub((x as usize) - (y as usize))
做不是制作z
一样y
即使我们假设T
有大小1
并且没有溢出:z
仍然附着在对象上x
附加到并取消引用它是未定义的行为,除非x
和y
指向同一个分配的对象。
与 sub
相比,此方法本质上延迟了留在同一分配对象内的要求:sub
在跨越对象边界时立即出现未定义行为; wrapping_sub
会生成一个指针,但如果在超出其所附加的对象的范围时取消引用指针,则仍会导致未定义行为。 sub
可以更好地优化,因此更适合性能敏感的代码。
延迟检查仅考虑被取消引用的指针的值,而不考虑在计算最终结果期间使用的中间值。例如,x.wrapping_add(o).wrapping_sub(o)
始终与 x
相同。换句话说,允许离开分配的对象,然后再重新进入它。
例子
基本用法:
// Iterate using a raw pointer in increments of two elements (backwards)
let data = [1u8, 2, 3, 4, 5];
let mut ptr: *const u8 = data.as_ptr();
let start_rounded_down = ptr.wrapping_sub(2);
ptr = ptr.wrapping_add(4);
let step = 2;
// This loop prints "5, 3, 1, "
while ptr != start_rounded_down {
unsafe {
print!("{}, ", *ptr);
}
ptr = ptr.wrapping_sub(step);
}
相关用法
- Rust pointer.wrapping_add用法及代码示例
- Rust pointer.wrapping_offset用法及代码示例
- 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_sub。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。