如何分区和使用与Rust一起分配的堆内存?

时间:2014-12-18 11:02:02

标签: memory-management rust flexible-array-member

我最近在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 个答案:

答案 0 :(得分:2)

就“灵活长度数组”而言,您可以使用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是你想要使用的。