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


Rust pointer.sub用法及代码示例


本文简要介绍rust语言中 pointer.sub 的用法。

用法

pub unsafe fn sub(self, count: usize) -> *const T

计算指针的偏移量(方便 .offset((count as isize).wrapping_neg()) )。

count以T为单位;例如,count 为 3 表示 3 * size_of::<T>() 字节的指针偏移量。

安全性

如果违反以下任何条件,则结果为未定义行为:

  • 起始指针和结果指针都必须位于同一 allocated object 的边界内或超出末尾一个字节。

  • 计算出的偏移量不能超过isize::MAX 字节.

  • 范围内的偏移量不能依赖于“wrapping around” 地址空间。也就是说,无限精度和必须适合使用大小。

编译器和标准库通常会尝试确保分配永远不会达到需要考虑偏移量的大小。例如,VecBox 确保它们分配的字节数永远不会超过 isize::MAX,因此 vec.as_ptr().add(vec.len()).sub(vec.len()) 始终是安全的。

大多数平台根本无法构建这样的分配。例如,没有已知的 64 位平台可以为 263由于page-table 限制或拆分地址空间而导致的字节数。但是,一些 32 位和 16 位平台可能会成功处理超过isize::MAX字节与物理地址扩展之类的东西。因此,直接从分配器或内存映射文件获取内存可能太大而无法处理此函数。

如果这些约束难以满足,请考虑使用wrapping_sub。此方法的唯一优点是它可以实现更积极的编译器优化。

例子

基本用法:

let s: &str = "123";

unsafe {
    let end: *const u8 = s.as_ptr().add(3);
    println!("{}", *end.sub(1) as char);
    println!("{}", *end.sub(2) as char);
}

相关用法


注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 pointer.sub。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。