gpt4 book ai didi

rust - 我是否需要对 Boxed 结构的 Box 子结构进行 Box 处理才能将所有内容都放在堆上?

转载 作者:行者123 更新时间:2023-11-29 08:22:43 26 4
gpt4 key购买 nike

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

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) }),
});
}

x2.childx2.child.n 应该在堆上吧? x1.childx1.child.n 在哪里:栈还是堆?

如果 child.nString 类型,n 应该是一个引用而 String 不需要Box 要放在堆上?这是正确的吗?

最佳答案

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

struct Outer1 {
child: Inner1,
}

struct Inner1 {
n: i32,
}

let x1 = Box::new(Outer1 {
child: Inner1 { n: 1 },
});

有这样的布局:

enter image description here

struct Outer2 {
child: Box<Inner2>,
}

struct Inner2 {
n: Box<i32>,
}

let x2 = Box::new(Outer2 {
child: Box::new(Inner2 { n: Box::new(1) }),
});

有这样的布局:

enter image description here

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

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

下面是包含字符串属性的结构的内存布局。

enter image description here

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

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

关于rust - 我是否需要对 Boxed 结构的 Box 子结构进行 Box 处理才能将所有内容都放在堆上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52927610/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com