Использование Box с HashMap в Rust

#rust #hashmap

#Ржавчина #hashmap

Вопрос:

Мне нужно создать большой HashMap в Rust, поэтому я подумал об использовании Box для использования памяти кучи.
Мой вопрос заключается в том, каков наилучший способ сохранить эти данные, конечно, я думал только о двух возможных способах (ожидая, что я не так опытен в Rust).


 fn main() {
  let hashmap = Box<HashMap<u64, DataStruct>>;
  ...
}
 

или

 fn main() {
  let hashmap = HashMap<u64, Box<DataStruct>>;
  ...
}
 

Каков наилучший способ справиться с такой проблемой?
Большое спасибо.

Ответ №1:

HashMap уже хранит свои данные в куче, вам не нужно вводить свои значения.

Как и векторы, хэш-карты хранят свои данные в куче. Эта HashMap содержит ключи типа String и значения типа i32. Как и векторы, хэш-карты однородны: все ключи должны иметь один и тот же тип, и все значения должны иметь один и тот же тип.

Источник

Комментарии:

1. Я никогда не находил эту информацию в документации Rust.

2. @Giuseppe в документах, похоже, об этом не упоминается, но в книге Rust есть: «Как и векторы, хэш-карты хранят свои данные в куче». doc.rust-lang.org/book /…

3. Просто чтобы добавить: как правило, почти все, что является динамическим , будет использовать кучу, потому что стек должен быть известен во время компиляции. Это означает, что объекты, которые могут расширяться (Vecs и HashMaps, поскольку вы можете добавлять элементы), которые имеют неопределенный срок службы (выделения Arcs и Rcs, поскольку они решают, когда освобождать, на основе подсчета ссылок), или которые имеют неизвестный размер (объекты признаков, рекурсивные структуры), будут выделены накуча, поскольку они не могут быть определены статически во время компиляции.

4. @RedBorg но в случаях рекурсивных структур и dyn Trait вы должны явно использовать Box , не так ли?

5. Я так думаю @IvanC