Как разделить и использовать кучную память, выделенную в массовом порядке с помощью Rust?

В последнее время я много читал о Rust, но все еще только начинаю окисляться. Мой мозг сохраняет большинство своих рефлексов C/C++, так что извините, если этот вопрос не актуален из-за того, как все происходит в Rust.

Можно ли вообще (желательно?) Выделить блок произвольного размера в куче, а затем отобразить структуру данных поверх него с привязками, получающими владение меньшими порциями памяти?

Используя C99, можно написать это:

typedef unsigned char BYTE;

typedef struct {
    size_t size;
    BYTE payload[];
} flex;

// ...

flex * flex_new(size_t _size) {
    flex *f = malloc(sizeof(flex) + _size * sizeof(BYTE));
    f->size = _size;
    return f;
}

Массивы с гибкой длиной могут оказаться полезными, например, при реализации пулов памяти с кусками переменного размера или при выделении памяти в куче, выделенной для потока. Структура данных, требуемый размер которой известен только во время выполнения, распределяется "атомарно", а ее элементы упаковываются непрерывно.

Мне интересно, возможна ли подобная реализация Rust (без unsafe конструкции) и если это так, то как это выглядит. Может быть, компилятор может вывести некоторую информацию, используя спецификаторы времени жизни в struct определение?

1 ответ

Решение

В терминах "гибких массивов длины" вы можете использовать Vec::with_capacity выделить больше, чем ваша насущная потребность:

let mut vec: Vec<int> = Vec::with_capacity(10);

// The vector contains no items, even though it has capacity for more
assert_eq!(vec.len(), 0);

// These are all done without reallocating...
for i in range(0i, 10) {
    vec.push(i);
}

// ...but this may make the vector reallocate
vec.push(11);

Для более общего случая TypedArena - это то, что вы хотели бы использовать.

Другие вопросы по тегам