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


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。