`String :: with_capacity()`是否等于`malloc`?

Afs*_*ani -1 memory-management rust

我几天前读过这篇文章,我想在Rust中实现这样一个东西的最佳方法是什么.本文建议在每次迭代后使用缓冲区而不是打印字符串.

这是正确的说String::with_capacity()(或Vec)等于mallocC吗?

代码示例:

String::with_capacity(size * 4096)
Run Code Online (Sandbox Code Playgroud)

等于:

char *buf = malloc(size * 4096);
Run Code Online (Sandbox Code Playgroud)

lje*_*drz 8

它不是"平等的",Rust String是一个复合对象; String::with_capacity创造一个String不仅是一个缓冲区; 它是一个包装Vec<u8>:

pub struct String {
    vec: Vec<u8>,
}
Run Code Online (Sandbox Code Playgroud)

并且a Vec不仅仅是内存中的一个部分 - 它还包含一个RawVec及其长度:

pub struct Vec<T> {
    buf: RawVec<T>,
    len: usize,
}
Run Code Online (Sandbox Code Playgroud)

并且a RawVec也不是原始的:

pub struct RawVec<T> {
    ptr: Unique<T>,
    cap: usize,
}
Run Code Online (Sandbox Code Playgroud)

所以当你打电话时String::with_capacity:

pub fn with_capacity(capacity: usize) -> String {
    String { vec: Vec::with_capacity(capacity) }
}
Run Code Online (Sandbox Code Playgroud)

除了保留一段内存之外,您所做的远不止这些.

  • @AfshinMehrabani很可能,你不想这样做.如果你只想要一个字节缓冲区,`Vec`就可以了.为了实现低级数据结构,可以使用不稳定的API,例如[`allocate`](https://doc.rust-lang.org/alloc/heap/fn.allocate.html). (5认同)