При работе программы данные могут храниться в различных областях памяти. В можно работать с статической памятью, стеком и кучей.
Объявление статической переменной в 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]);
}
Обратите внимание, что используется 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);
}
}
}
}