我对Rust还是个新手,正在努力了解拳击的工作原理. 默认情况下,对象在堆栈中分配. 在接下来的代码中,对象"S"被分配到堆栈中.这意味着变量x和y被分配到堆栈中.

struct MyStruct {
    x: u64,
    y: u64,
}

let s = MyStruct { //allocation in the stack ? both x and y allocated in stack?
      x : 120, y: 100,
};

现在,如果我将变量‘S’装箱,它会被移到堆中吗?

let boxed_s = Box::new(s); //move to heap ? copy x and y bytes to heap?

这意味着存在从堆栈到堆的逐字节复制,因为它需要为x和y分配和移动值?

如果是这样的话,这不是造成了开销吗?

或者,编译器是否会在编译时进行一些优化,以确保在运行时将对象‘S’直接分配到堆中?

推荐答案

那得看情况.

通常,如果创建实例并立即将其包装在Box中,编译器应该以一种直接在堆上创建实例的方式对其进行优化,而不会在堆栈上进行不必要的分配.

如果您首先创建一个实例并使用它before,然后将其移动到Box,则不会进行上述优化.这意味着,该值最初将位于堆栈上,然后是moved到堆.从技术上讲,我所说的"移动"是指内部字节将是堆的copied个字节,堆栈上的旧字节将不再被使用(通常它们应该在不久之后被释放,以及将从堆栈中"弹出"的其他函数数据).

Rust相关问答推荐

获取字符串切片(&;str)上的切片([ia..ib])返回字符串

为什么';t std::cell::ref使用引用而不是非空?

对reqwest提供的这种嵌套JSON struct 进行反序列化

为什么 GAT、生命周期和异步的这种组合需要 `T: 'static`?

提取指向特征函数的原始指针

当推送到 HashMap 中的 Vector 时,类型 `()` 无法取消引用

存储返回 impl Trait 作为特征对象的函数

无法将`&Vec>`转换为`&[&str]`

Rust typestate 模式:实现多个状态?

使用 traits 时,borrow 的值不会存在足够长的时间

将 Futures 的生命周期特征绑定到 fn 参数

当 T 不是副本时,为什么取消引用 Box 不会抱怨移出共享引用?

为什么指定生命周期让我返回一个引用?

仅当满足外部条件时如何添加到 actix web 的路由

如果我不想运行析构函数,如何移出具有析构函数的 struct ?

如何为返回正确类型的枚举实现 get 方法?

使用泛型作为关联类型,没有幻像数据

在 Rust 中退出进程

为什么我可以从读取的可变自引用中移出?

Rust:为什么在 struct 中borrow 引用会borrow 整个 struct?