Rust 是否跟踪唯一的对象 ID,我们可以打印它们吗?

Chr*_*oph 3 identity rust

Rust 是否在幕后为每个对象使用某种类型的实例 ID,如果是这样,是否可以使其可见?

考虑这个

struct SomeStruct;

fn main() {
    let some_thing = SomeStruct;
    println!("{:UniqueId}", some_thing);
    let another = some_thing;
    println!("{:UniqueId}", another);
}
Run Code Online (Sandbox Code Playgroud)

我在这里使用伪格式字符串{:UniqueId}。在这种情况下,它可能会打印

struct SomeStruct;

fn main() {
    let some_thing = SomeStruct;
    println!("{:UniqueId}", some_thing);
    let another = some_thing;
    println!("{:UniqueId}", another);
}
Run Code Online (Sandbox Code Playgroud)

我知道 Rust 会按位复制,我想让它真正可见。如果我有这样的实例 ID,我可以通过比较 ID 使其可见。

不过,可能有另一种方法可以实现相同的目标。

She*_*ter 5

不,Rust 没有任何自动生成的对象 ID。这种功能会给每个用户带来一些开销,而 Rust 希望尽可能少地施加开销。其他一切都应该选择加入。


据我所知,一个项目的地址是唯一的:

struct SomeStruct;

fn main() {
    let some_thing = SomeStruct;
    println!("{:p}", &some_thing);
    let another = some_thing;
    println!("{:p}", &another);
}
Run Code Online (Sandbox Code Playgroud)
struct SomeStruct;

fn main() {
    let some_thing = SomeStruct;
    println!("{:p}", &some_thing);
    let another = some_thing;
    println!("{:p}", &another);
}
Run Code Online (Sandbox Code Playgroud)

所有1都在某处占用空间,因此您可以获取该空间的地址并打印出来。

对于某些情况,这可能独特了。例如,当您转让项目的所有权时,您可能希望 ID 保持不变。我认为在这种情况下,你必须自己动手。类似于全局原子变量的东西,您可以在创建对象时从中提取。这种方案不适用于您无法控制的对象。


1 - 嗯,几乎所有的东西。我知道const项目不能保证有一个位置,这就是static项目存在的原因。

  • **警告**:Rust 语言不做任何保证,因此优化器在效率更高时可以自由地不移动(在内存中)。因此,在调试中观察到的移动可能不会在发布中发生,并且两次执行仍然有效。 (2认同)