Как правильно ссылаться на память в структурах? - PullRequest
0 голосов
/ 27 октября 2019

У меня есть структура под названием Пицца . Он содержит одну Base структуру и вектор Topping структур.

У меня есть вспомогательный метод, который возвращает Pizza . В ближайшем будущем я вижу, что начинки где-то являются коллекцией, и Pizza s динамически создается из этой коллекции Topping s (стиль смешивания и сопоставления).

Мой вопрос о том, как структура должна ссылаться на Bases и Toppings. Если я передам владение структурой, то это облегчит ее обработку (нет объявлений о времени жизни, вспомогательные методы также проще, поскольку им больше не нужно создавать память вне области видимости). Однако, если Topping s выходит за рамки моего вспомогательного метода и объявить время жизни, я получаю меньше повторений в памяти.

Как люди рассуждают об этих проблемах? Есть ли рекомендуемое эмпирическое правило, которому нужно следовать? Возможно ли иметь оба?

1 Ответ

1 голос
/ 01 ноября 2019

Если Topping мало (например, enum), то вы можете просто скопировать его (например, в Vec<Topping>).

Если Topping велико и вам нужна только одна копия впамяти, с которой проще всего работать - это использовать Arc<Topping>, который является общим указателем, и его можно дешево клонировать и легко передавать (например, в Vec<Arc<Topping>>).

Если оба Pizza и Topping используются только в определенной статически известной области (например, вы создаете все начинки в main() и не меняете их позже, или используете пул памяти), вы можете избежать использования &'a Topping в Pizza<'a>, но это, вероятно, незначительно улучшит производительность по сравнению с Rc / Arc, и отслеживание временного срока службы будет раздражать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...