gpt4 book ai didi

data-structures - 迭代 HashMaps 如何在内存中工作 : Rust

转载 作者:行者123 更新时间:2023-12-04 07:30:45 24 4
gpt4 key购买 nike

我知道如何在 Rust 中迭代 HashMap,但是,我对它在内存中的工作方式有些困惑。我们如何迭代未按顺序存储在内存中的值?在堆和堆栈级别对以下代码的详细解释将不胜感激。

use std::collections::HashMap;

let name = vec![String::from("Charlie"), String::from("Winston"), String::from("Brian"), String::from("Jack")];
let age = vec![50, 5, 7, 21];

let mut people_ages: HashMap<String, i32> = name.into_iter().zip(age.into_iter()).collect();


for (key, value) in &people_ages {
println!("{}: {}", key, value);
}

最佳答案

documentation的介绍的最后,提到实现依赖于 C++ implementation of SwissTables .
此页面包含有关两种变体的插图:基于 « flat » 和 « node »。
这两个变体之间的主要区别是指针稳定性。
在基于 « node » 的版本中,键值对一旦插入,即使重新组织散列,也会将其地址保留在内存中。
在 « flat » 版本中,一些插入/删除可以使之前的键值对在内存中移动。
当谈到 Rust 实现时,我的经验不足,无法确定任何具体细节,但我根据您的示例尝试了这个简单的示例。

use std::collections::HashMap;

fn main() {
let name = vec![
String::from("Charlie"),
String::from("Winston"),
String::from("Brian"),
String::from("Jack"),
];
let age = vec![50, 5, 7, 21];
let mut people_ages: HashMap<String, i32> =
name.into_iter().zip(age.into_iter()).collect();
let mut keys = Vec::new();
let mut values = Vec::new();
for (key, value) in &people_ages {
keys.push(key);
values.push(value);
let key_addr = key as *const String as usize;
let value_addr = value as *const i32 as usize;
println!("{:x} {:x} {}: {}", key_addr, value_addr, key, value);
}
// people_ages.insert("Bob".to_owned(), 4); // mutable and immutable borrow
println!("keys: {:?}", keys);
println!("values: {:?}", values);
}
/*
55e08ff8bd40 55e08ff8bd58 Brian: 7
55e08ff8bd20 55e08ff8bd38 Charlie: 50
55e08ff8bd00 55e08ff8bd18 Winston: 5
55e08ff8bce0 55e08ff8bcf8 Jack: 21
keys: ["Brian", "Charlie", "Winston", "Jack"]
values: [7, 50, 5, 21]
*/
注释掉的行(插入)被拒绝,因为我们无法在保留对其内容的引用的同时更改哈希映射。
因此,我 猜测 (我不确定)该实现不依赖于基于 « node » 的变体,因为我们无法利用它提供的指针稳定性(由于 Rust 中的所有权模型),以及 可能 它依赖于“平面”变体。
这意味着我们可以预期与相同散列关联的键值对紧密地打包在内存中,并且对它们进行迭代应该与对向量进行迭代非常相似:常规进展(但是有一些跳过)对缓存预取非常友好.
打印地址倾向于确认猜测(但是测试还不够完整),并显示出一个向后的进展。

关于data-structures - 迭代 HashMaps 如何在内存中工作 : Rust,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67946572/

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