Как разделить и использовать кучную память, выделенную в массовом порядке с помощью 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 - это то, что вы хотели бы использовать.