Memory management 如何分区和使用大量分配的堆内存?

Memory management 如何分区和使用大量分配的堆内存?,memory-management,rust,flexible-array-member,Memory Management,Rust,Flexible Array Member,最近我读了很多关于锈病的书,但我还是刚刚开始氧化。我的大脑保留了大部分的C/C++反射,所以如果这个问题因为在锈迹中是如何完成的而不相关,请原谅我 在堆上分配一个任意大小的块,然后在上面映射一个数据结构,使绑定拥有较小的内存块,这通常是可能的(可取的吗?) 使用C99,您可以这样写: typedef unsigned char BYTE; typedef struct { size_t size; BYTE payload[]; } flex; // ... flex *

最近我读了很多关于锈病的书,但我还是刚刚开始氧化。我的大脑保留了大部分的C/C++反射,所以如果这个问题因为在锈迹中是如何完成的而不相关,请原谅我

在堆上分配一个任意大小的块,然后在上面映射一个数据结构,使绑定拥有较小的内存块,这通常是可能的(可取的吗?)

使用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实现是否可能(没有
不安全的
构造),如果可能,它看起来是什么样子。编译器可能会使用
struct
definition?

中的生命周期说明符推断出一些信息,就“灵活长度数组”而言,您可以使用这些说明符来分配超出当前需要的信息:

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);
让mut-vec:vec=vec::具有_容量(10);
//向量不包含任何项,即使它具有容纳更多项的能力
断言!(向量len(),0);
//这些都是在没有重新分配的情况下完成的。。。
适用于范围内的i(0i,10){
向量推(i);
}
//…但这可能会使向量重新分配
向量推(11);

但是,对于更一般的情况,这是您想要使用的。

它可能有很好的用途,但如果是这样的话,他们可能使用了
不安全的
。实际上,许多您期望的库都发现了不同的方法,这并没有帮助:
Vec
是一个
(ptr,length,capacity)
三元组,而不是指向
(length,capacity,items)
,和
Arena
背驮在
Vec
s上,从未调整过大小。我不知道
Arena
,我会立即查看,谢谢!我应该声明,只要
std
中提供了安全接口或作为其候选接口,我不在乎是否使用了
safe
。@delnan听起来你应该添加这一点作为答案^_^竞技场的链接似乎已断开