Rust 中是否明确定义了分配之间的比较指针?

orl*_*rlp 12 pointers language-lawyer rust

我有一个指向的元素buf: *const T分配开始的指针,并且定义了以下检查:nT

let in_alloc = buf <= ptr && ptr < unsafe { buf.add(n) };
Run Code Online (Sandbox Code Playgroud)

是否保证 是in_alloc的分配中的true任何一个,以及在任何其他情况下?我们可以假设是一个指向对象的有效指针(因此不是未对齐/空/悬挂),但是它可能来自也可能不是来自与 相同的分配。最后我们可以假设大小不为零。ptrbuffalseptrTbufT

GMa*_*ckG 8

回答标题,比较任意两个指针是明确定义的,因为指针实现了Ord.

由于指针是完全有序的,所以问题的主体很容易由此得出。您有一组n不同的指针,起始于buf + 0并结束于buf + (n - 1)。如果ptr小于则buf不能等于其中任何一个。如果ptr大于buf + (n - 1)它也不能等于它们。如果ptr是其中之一,则两个表达式的计算结果均为 true。

您可以稍微回避这个问题并使用Range

let end = unsafe { buf.add(n) };
let in_alloc = (buf..end).contains(ptr);
Run Code Online (Sandbox Code Playgroud)

例如,这经常用于检查切片是否包含指针

  • 我喜欢这个答案,因为它仅取决于指针类型的特征实现所隐含的数学属性(嗯,并且知道分配不能以某种方式_交错_)。 (2认同)