2015-04-24 2 views
3

Когда было бы целесообразно спроектировать структуру данных, которая вставляет Box и Vec (или наоборот)?Когда использовать Box <Vec<..>> или Vec <Box<..>>?

Похоже, в большинстве случаев, когда вы хотите хранить несколько вещей фиксированного размера в куче, то Box является излишним, так как это только (?) Роль в куче-выделить ~ одно значение, а нормальный Vec уже куча, выделяющая его хранилище.

Контекст: Я все еще обнимаю роли различных типов ржавчины для создания структур данных.

+1

Единственный прецедент, который я могу придумать, связан с небезопасным поведением, например, если объекты кучи имеют фиксированное положение указателя, даже если 'Vec' перераспределяет. – Levans

ответ

7

Есть действительно только несколько раз вам нужно использовать Box:

  • Рекурсивные структуры данных: не соответствующие для внешнего элемента, поэтому нет необходимости в Vec<Box<T>>.

  • Собственный объект-объект, который должен быть Box<Trait>, потому что размер объекта является динамическим;

  • Вещи, которые чувствительны к конкретным адресам памяти, чтобы содержащиеся объекты сохраняли одно и то же место в памяти (практически никогда не случалось и определенно не было в любом стабильном публичном API, а некоторые из элементов дескриптора, std::sync::mpsc::Select это единственный случай, когда я знаю,.. это небезопасность и уход требуется, это часть того, почему select! существует Такого рода вещи (Handle.add) небезопасна материал

Если ни одна из этих ситуаций не применяются, вы не должны использовать Box. И Box<Vec<T>> is o ne такой случай; бокс совершенно лишний, добавив дополнительный уровень косвенности, чтобы не принести никакой пользы.

Так простая версия:

  • Box<Vec<T>>: никогда.
  • Vec<Box<T>>: только если T является признаком, то есть вы работаете с объектами признаков.
Смежные вопросы