Как распределить массивы в куче в Rust 1.0?

Для этого уже существует question, но связано с Rust 0.13, и синтаксис, похоже, изменился. Из текущей документации я понял, что создание массива в куче будет примерно таким:

fn main() {
    const SIZE: usize = 1024 * 1024;
    Box::new([10.0; SIZE]);
}

Но когда я запускаю эту программу, я получаю следующую ошибку:

thread '<main>' has overflowed its stack

Что я делаю неправильно?

Ответ 1

Проблема заключается в том, что массив передается функции Box::new в качестве аргумента, что означает, что он должен быть создан первым, что означает, что он должен быть создан в стеке.

Вы просите компилятор создать 8 мегабайт данных в стеке: это то, что переполняет его.

Решение состоит в том, чтобы не использовать массив фиксированного размера вообще, а < <21 > . Самый простой способ создать Vec из 8 миллионов 10.0:

fn main() {
    const SIZE: usize = 1024 * 1024;
    let v = vec![10.0; SIZE];
}

Или, если по какой-то причине вы предпочитаете использовать итераторы:

use std::iter::repeat;

fn main() {
    const SIZE: usize = 1024 * 1024;
    let v: Vec<_> = repeat(10.0).take(SIZE).collect();
}

Это должно выполнять только одно распределение кучи.

Изменить. Также обратите внимание, что впоследствии вы можете взять Vec и превратить его в Box<[_]> с помощью into_boxed_slice.