|
|
@ -183,6 +183,7 @@ fn main() {
|
|
|
|
|
|
|
|
|
|
|
|
那如果数组中每个元素都是一个 `Box` 对象呢?来看看 `Vec<Box<i32>>` 的内存布局:
|
|
|
|
那如果数组中每个元素都是一个 `Box` 对象呢?来看看 `Vec<Box<i32>>` 的内存布局:
|
|
|
|
```rust
|
|
|
|
```rust
|
|
|
|
|
|
|
|
(heap)
|
|
|
|
(stack) (heap) ┌───┐
|
|
|
|
(stack) (heap) ┌───┐
|
|
|
|
┌──────┐ ┌───┐ ┌─→│ 1 │
|
|
|
|
┌──────┐ ┌───┐ ┌─→│ 1 │
|
|
|
|
│ vec2 │──→│B1 │─┘ └───┘
|
|
|
|
│ vec2 │──→│B1 │─┘ └───┘
|
|
|
@ -234,7 +235,7 @@ fn gen_static_str() -> &'static str{
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
在之前的代码中,如果 `String` 创建于函数中,那么返回它的唯一方法就是转移所有权给调用者 `fn move_str() -> String`,而通过 `Box::leak` 我们不仅返回了一个 `&str` 字符串切片,它还是 `'static` 类型的!
|
|
|
|
在之前的代码中,如果 `String` 创建于函数中,那么返回它的唯一方法就是转移所有权给调用者 `fn move_str() -> String`,而通过 `Box::leak` 我们不仅返回了一个 `&str` 字符串切片,它还是 `'static` 生命周期的!
|
|
|
|
|
|
|
|
|
|
|
|
要知道真正具有 `'static` 生命周期的往往都是编译期就创建的值,例如 `let v = "hello, world"`,这里 `v` 是直接打包到二进制可执行文件中的,因此该字符串具有 `'static` 生命周期,再比如 `const` 常量。
|
|
|
|
要知道真正具有 `'static` 生命周期的往往都是编译期就创建的值,例如 `let v = "hello, world"`,这里 `v` 是直接打包到二进制可执行文件中的,因此该字符串具有 `'static` 生命周期,再比如 `const` 常量。
|
|
|
|
|
|
|
|
|
|
|
|