Перейти к содержанию

Стек против Кучи в Rust

Posted on:14 февраля 2023 г. at 19:22

Example Dynamic OG Image link

Эта тема возникает довольно часто из-за путаницы в том, как Rust управляет памятью.

В Rust (и большинстве языков программирования) память разделена на две основные части: стек и кучу.

Стек - это область памяти, которая используется для хранения фреймов вызова функции и локальных переменных. Стек быстр и эффективен, поскольку данные хранятся и к ним осуществляется доступ в порядке поступления первыми (LIFO), что означает, что при возврате функции ее фрейм немедленно извлекается из верхней части стека. В Rust значения, выделенные стеком, хранятся в стеке и автоматически очищаются, когда они выходят за пределы области видимости.

Куча, с другой стороны, представляет собой область памяти, которая используется для хранения значений, которые требуются в течение более длительного периода времени. В отличие от стека, куча не имеет фиксированного размера и может увеличиваться или уменьшаться по мере необходимости. Значения, выделенные для кучи, хранятся в ней и на них ссылаются с помощью указателей. В Rust управление значениями, выделяемыми в куче, осуществляется с помощью системы владения и заимствования, которая гарантирует автоматическую очистку данных, когда они больше не нужны.

Вот простой пример, который демонстрирует разницу между распределением стека и кучи в Rust:

fn main() {
	let a = 50; // это значение в стеке
	let b = Box::new(1); // а это значение размещается в стеке
}

В этом примере a - это целое число, находящееся в стеке, а b - целое число, находится в выделенной памяти кучи, хранящееся в поле. Поле - это тип интеллектуального указателя, который имеет право собственности на данные, хранящиеся в куче. Когда b выходит за пределы области видимости, память, на которую он ссылается, будет автоматически освобождена.

В общем, распределение стека предпочтительнее, чем распределение кучи, поскольку это быстрее и эффективнее. Однако бывают случаи, когда выделение кучи необходимо, например, при работе с большими объемами данных или когда данные необходимо совместно использовать между несколькими функциями.

Надеюсь, что это немного прояснит ситуацию для программиста, новичка в Rust.