D. *_*dal 1 memory-management vector rust
考虑以下代码:
fn main() {
let mut vec: Vec<u8> = Vec::new();
vec.push(0);
vec.push(1);
vec.push(2);
vec.push(3);
vec.push(4);
vec.push(5);
vec.push(6);
vec.push(7);
vec.push(8);
}
Run Code Online (Sandbox Code Playgroud)
当Vec::new()
被调用时,Rust 不知道分配多少,每次它需要为一个向量分配更多空间时,它malloc
以新的大小调用,然后将堆中旧位置的所有数据克隆到新位置,对?
Rust 知道要分配的新大小的策略是什么?
例如,每次将某些东西推送到向量上时,Rust 是否会像这样分配?
[]
[0]
[0, 1]
[0, 1, 2]
[0, 1, 2, 3]
etc...
Run Code Online (Sandbox Code Playgroud)
这似乎效率低下。也许 Rust 会做这样的事情:
[]
[0, <empty>]
[0, 1]
[0, 1, 2, <empty>, <empty>, <empty>, <empty>, <empty>]
[0, 1, 2, 3, <empty>, <empty>, <empty>, <empty>]
[0, 1, 2, 3, 4, <empty>, <empty>, <empty>]
etc...
Run Code Online (Sandbox Code Playgroud)
在VEC文档说这个:
Vec 在已满时重新分配时或在调用 Reserve 时不保证任何特定的增长策略。当前的策略是基本的,使用非常数增长因子可能会被证明是可取的。无论使用什么策略,当然都会保证 O(1) 摊销推送。
摊销 O(1) 推送的保证意味着 Rust 不会在每次推送时重新分配。它必须看起来更像您描述的第二个场景,它分配额外的容量来为要推送的其他元素腾出空间。
如果我们深入研究 Rust 标准库的源代码,我们会看到在这种情况下(一次推送一个元素),Vec 的当前实现实际上在每次重新分配时将 Vec的容量加倍。当然,这个确切的策略并没有被指定,并且可能会在未来的实现中发生变化。
如果您从一开始就知道您的 Vec 需要多大,您可以使用Vec::with_capacity构建它以避免任何重新分配的需要。
归档时间: |
|
查看次数: |
939 次 |
最近记录: |