5

我最近读了很多关于 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定义中的生命周期说明符来推断一些信息?

4

1 回答 1

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是您想要使用的。

于 2014-12-19T20:19:11.627 回答