gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:51:37 27 4
gpt4 key购买 nike

我最近读了很多关于 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com