Skip to content

Latest commit

 

History

History
79 lines (64 loc) · 3.21 KB

ch-12-memory-allocation.md

File metadata and controls

79 lines (64 loc) · 3.21 KB

Использование различных мест хранения переменных

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

Виды памяти

Статическая память

Объявление статической переменной в Rust:

fn main() {
    static 
    // mut 
    A: u32 = 3;

    // for i in 0..1000 {
    //     A += i;
    // }
    println!("{}", A);
}
Домашнее задание

Попробуйте изменить значение статической переменной. Изучите сообщения компилятора.

Стековая память

Именно в ней происходит работа переменных функций. Она небольшого зармера (может быть порятка нескольких мегабайт) поэтому имеет существенные ограничения.

Куча

Для работы с большим числом данных весьма удобно работать с виртуальным пространством памяти, в котором в определенный момент времени предоставляется доступ части памяти, а не ко всей сразу. Пример работы с кучей:

fn main() {
    let _value_i8: Box<i8> = Box::new(0);
    let _value_i16: Box<i16> = Box::new(0);
    let _value_i32: Box<i32> = Box::new(0);
    let _value_i64: Box<i64> = Box::new(0);

    let _value_u8: Box<u8> = Box::new(0);
    let _value_u16: Box<u16> = Box::new(0);
    let _value_u32: Box<u32> = Box::new(0);
    let _value_u64: Box<u64> = Box::new(0);

    let _value_bool1: Box<bool> = Box::new(true);
    let _value_bool2: Box<bool> = Box::new(!true);

    let _value_char: Box<char> = Box::new('e');
    let _value_string: Box<String> = Box::new(format!("true"));
    let _value_array1:Box<[u8;10]> = Box::new([0;10]);
}

Rust Playground

Обратите внимание, что используется Box<T>, который переносят значения в кучу и при обращении к ним получают их из неё. В куче могут быть данные любых типов - от примитивных до сложный.

Домашнее задание

Напишите программы, в которых переменные охраняться в куче. Придумайте программу, которая будет "много мусорить" - т.е. оставлять много фрагментов памяти. Вариант решения:

fn main() {
    for _j in 0..1000 {
        for _i in 0..1000 {
            {
                Box::new(0u8);
            }
        }
        
        for _i in 0..1000 {
            {
                Box::new(0u8);
            }
        }

  
    }
}