Как заполнить Ve c с помощью u64 :: max_value () - PullRequest
0 голосов
/ 23 января 2020

Есть ли способ в ржавчине заполнить ve c его диапазоном, который имеет предел u64::max_value?

fn main() {
    let vals: Vec<u64> = (2..u64::max_value()).collect();
    println!("{:?}", vals.len());
}

бросков компилятора: thread 'main' panicked at 'capacity overflow', src/liballoc/raw_vec.rs:777:5

Ответы [ 2 ]

5 голосов
/ 23 января 2020

Я полагаю, что ваш компьютер имеет 64-битную архитектуру. Это означает, что он может адресовать не более 2 ^ 64 байт (на практике это меньше).

Теперь, поскольку размер u64 составляет 8 байт, вы пытаетесь зарезервировать 8 * 2^64 байт. , Ваш компьютер не может даже адресовать такое количество байтов!

Кроме того, вы пытаетесь выделить несколько миллионов терабайт в оперативной памяти. Это не разумный объем памяти.

Строка, которая паникует в std lib, выглядит следующим образом:

let alloc_size = capacity.checked_mul(elem_size).unwrap_or_else(|| capacity_overflow());

Он проверяет, что емкость (количество элементов) умножается на размер вашего элемента (8 байтов, как я уже сказал) не переполняется. Это программный c способ представить мои прежние рассуждения.

4 голосов
/ 23 января 2020

Нет.

u64::max_value() - это огромное число. У тебя не так много памяти. Никто не делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...