当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust pointer.wrapping_sub用法及代码示例


本文简要介绍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附加到并取消引用它是未定义的行为,除非xy指向同一个分配的对象。

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-lang.org大神的英文原创作品 pointer.wrapping_sub。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。