我最近在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
定义中的生命周期指示符来推断一些信息?
答案 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是你想要使用的。