我是否需要对装箱结构的子结构进行装箱才能获取堆上的所有内容?

Mar*_*kus 3 rust

Box我不明白 Rust 中当我们作为父结构时,结构中的结构会发生什么。

struct Outer1 {
    child: Inner1,
}

struct Inner1 {
    n: i32,
}

struct Outer2 {
    child: Box<Inner2>,
}

struct Inner2 {
    n: Box<i32>,
}

pub fn main() {
    let x1 = Box::new(Outer1 {
        child: Inner1 { n: 1 },
    });
    let x2 = Box::new(Outer2 {
        child: Box::new(Inner2 { n: Box::new(1) }),
    });
}
Run Code Online (Sandbox Code Playgroud)

x2.child并且x2.child.n应该在堆上,对吧?x1.childx1.child.n:堆栈或堆在哪里?

如果child.n是类型Stringn应该是引用并且String不需要Box在堆上?它是否正确?

att*_*ona 8

想象每种类型(Outer1Inner1i32)都有一种颜色,并且内存插槽由一个或多个堆叠/嵌入的彩色字节帧组成。

struct Outer1 {
    child: Inner1,
}

struct Inner1 {
    n: i32,
}

let x1 = Box::new(Outer1 {
    child: Inner1 { n: 1 },
});
Run Code Online (Sandbox Code Playgroud)

有这样的布局:

在此输入图像描述

struct Outer2 {
    child: Box<Inner2>,
}

struct Inner2 {
    n: Box<i32>,
}

let x2 = Box::new(Outer2 {
    child: Box::new(Inner2 { n: Box::new(1) }),
});
Run Code Online (Sandbox Code Playgroud)

有这样的布局:

在此输入图像描述

每个都Box<Something>开始一个新的彩色框架。

显然内存不是彩色的:这是一个可能有助于表示的概念:真正存在的只是字节,最终由于内存对齐而浪费了一些空间。

下面是包含 String 属性的结构的内存布局。

在此输入图像描述

字符串由三个部分组成:指向缓冲区的指针、长度和容量(在示例中它们位于堆栈上)以及始终存储在堆上的缓冲区。

注意:上面的示例指针大小是相对于 64 位架构而言的。