Лучше выделить слишком много памяти в стеке или правильное количество в куче? - PullRequest
0 голосов
/ 01 декабря 2018

Я только начал изучать ржавчину, и это мой первый правильный взгляд на язык низкого уровня (я обычно делаю на python).Часть учебника объясняет, что строковый литерал хранится в стеке, потому что он имеет фиксированный (и известный) размер;это также объясняет, что неинициализированная строка хранится в куче, так что ее размер может увеличиваться по мере необходимости.

Насколько я понимаю, стек намного быстрее, чем куча.В случае строки, размер которой неизвестен, но я знаю, что она никогда не потребует больше, чем n байтов, имеет ли смысл выделять место в стеке для максимального размера вместо того, чтобы вставлять ее в кучу?

Цель этого вопроса не в том, чтобы решить проблему, а в том, чтобы помочь мне понять, поэтому я был бы признателен за подробные и подробные ответы!

1 Ответ

0 голосов
/ 06 декабря 2018

Разница в производительности между стеком и кучей возникает из-за того, что объекты в куче могут изменить размер во время выполнения, и их затем необходимо перераспределить где-нибудь еще в куче.

Теперь длямногословная часть.Представьте, что у вас есть целое число i32.Это число всегда будет одинакового размера, поэтому любые изменения, внесенные в него, будут происходить на месте.Когда он выходит из области видимости (он перестает быть необходимым в программе), он либо удаляется, либо, для более эффективного решения, он удаляется вместе со всем стеком, к которому он принадлежит.

Теперь вы хотитесоздать строку.Итак, вы создаете его в куче и присваиваете ему значениеА затем вы модифицируете его и добавляете к нему несколько символов.Теперь могут произойти две вещи.

  1. После строки имеется свободная память, поэтому распределитель использует эту память для записи новой части.
  2. В памяти уже выделен объектсразу после строки, и, конечно, вы не хотите перезаписывать ее.Таким образом, распределитель ищет следующую свободную область памяти достаточного размера для размещения новой строки и копирует в нее эту строку.Затем удаляет старую, освобождая эту память.

Как видно из кучи, количество выполняемых операций невероятно выше, чем в стеке, поэтому его производительность будет ниже.

Теперь в вашем случае есть несколько методов специально для резервирования памяти.String::reserve() и String::reserve_exact().Я бы порекомендовал вам всегда смотреть документацию по Rust.Обычно уже есть метод std для того, что вы хотите.

...