Разница в производительности между стеком и кучей возникает из-за того, что объекты в куче могут изменить размер во время выполнения, и их затем необходимо перераспределить где-нибудь еще в куче.
Теперь длямногословная часть.Представьте, что у вас есть целое число i32.Это число всегда будет одинакового размера, поэтому любые изменения, внесенные в него, будут происходить на месте.Когда он выходит из области видимости (он перестает быть необходимым в программе), он либо удаляется, либо, для более эффективного решения, он удаляется вместе со всем стеком, к которому он принадлежит.
Теперь вы хотитесоздать строку.Итак, вы создаете его в куче и присваиваете ему значениеА затем вы модифицируете его и добавляете к нему несколько символов.Теперь могут произойти две вещи.
- После строки имеется свободная память, поэтому распределитель использует эту память для записи новой части.
- В памяти уже выделен объектсразу после строки, и, конечно, вы не хотите перезаписывать ее.Таким образом, распределитель ищет следующую свободную область памяти достаточного размера для размещения новой строки и копирует в нее эту строку.Затем удаляет старую, освобождая эту память.
Как видно из кучи, количество выполняемых операций невероятно выше, чем в стеке, поэтому его производительность будет ниже.
Теперь в вашем случае есть несколько методов специально для резервирования памяти.String::reserve()
и String::reserve_exact()
.Я бы порекомендовал вам всегда смотреть документацию по Rust.Обычно уже есть метод std для того, что вы хотите.