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

标签 memory-management rust flexible-array-member

我最近读了很多关于 Rust 的书,但我仍然才开始氧化。我的大脑保留了大部分 C/C++ react ,所以如果这个问题与 Rust 中的工作方式无关,请原谅我。

通常是否可以(需要?)在堆上分配任意大小的 block ,然后通过绑定(bind)获取较小内存块的所有权来映射数据结构?

使用 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 定义中的生命周期说明符推断出一些信息?

最佳答案

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

关于memory-management - 如何分区和使用与 Rust 一起分配的堆内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27545000/

相关文章:

iphone - 具有大图像尺寸的 UIImage - 内存问题 - 崩溃

memory-management - 将计算量过大而无法放入内存的最佳方法?

methods - 如何通过函数指针调用方法?

c - 结构中未调整大小的数组声明

c - 更新结构中变量的值会导致同一结构中的另一个变量被修改

c - 在 mmap 中使用灵活的数组成员

python - 如何销毁 Python 对象并释放内存

ios - 在 cellForRowAtIndexPath : 处增长的事件字节数

rust - 拥有指向特征的指针

websocket - 带有 Rust 服务器的 Elm websockets