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.child和x1.child.n:堆栈或堆在哪里?
如果child.n是类型String,n应该是引用并且String不需要Box在堆上?它是否正确?
想象每种类型(Outer1、Inner1、i32)都有一种颜色,并且内存插槽由一个或多个堆叠/嵌入的彩色字节帧组成。
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 位架构而言的。
| 归档时间: |
|
| 查看次数: |
2039 次 |
| 最近记录: |