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

Memory management 'String::with_capacity()`是否等于'malloc`?,memory-management,rust,Memory Management,Rust,几天前我读了一篇文章,我想在Rust中实现这样一个功能的最好方法是什么。本文建议使用缓冲区,而不是在每次迭代后打印字符串 说String::with_capacity()(或Vec)等于C中的malloc是否正确 代码中的示例: String::with_capacity(size * 4096) 等于: char *buf = malloc(size * 4096); 这不太准确。如果说String::with_capacity类似于std::String::reserve,那就更有意义了

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

String::with_capacity()
(或
Vec
)等于C中的
malloc
是否正确

代码中的示例:

String::with_capacity(size * 4096)
等于:

char *buf = malloc(size * 4096);

这不太准确。如果说
String::with_capacity
类似于
std::String::reserve
,那就更有意义了。从文件中:

创建具有特定容量的新空字符串

字符串有一个内部缓冲区来保存其数据。容量是 该缓冲区的长度,并且可以使用容量进行查询 方法。此方法创建一个空字符串,但其中包含一个初始值 可以容纳容量字节的缓冲区。这在您可能需要时非常有用 将一组数据追加到字符串,减少 重新分配它需要做的事情

如果给定容量为0,则不会进行分配,并且此方法 与新方法相同

它是否使用类似于
malloc
的东西来管理内部缓冲区是一个实现细节

回应您的编辑:

您明确地分配内存,而在C++中,对于<>代码STD::String::保留< /代码>的内存分配只在传递给Retry的参数大于现有容量时发生。请注意,Rust的

String
确实有一个
reserve
方法,但C++的String没有一个
具有相同容量的

它不是“相等”,Rust的
字符串是一个复合对象<代码>字符串::具有_容量
创建一个不只是缓冲区的缓冲区;它是一个围绕着一个
Vec
的包装器:

a也不是原语:

pub struct RawVec<T> {
    ptr: Unique<T>,
    cap: usize,
}
您所做的不仅仅是保留一部分内存。

两件事:

  • 如果您链接到分配器,那么只需调用malloc
  • 默认全局分配器的挂钩仍然不稳定,但是如果您每晚都在使用,则可以直接调用它

  • 在今天的stable Rust上,如果你想使用全局分配器,你能得到的最接近的东西是Vec,但由于其他答案中所述的原因,它并不等同于Vec。

    为什么要发布此代码?你的问题不需要这个,不是吗?这篇文章也不值得问这个问题。他们绝对不平等,但我想知道你在寻找什么样的答案。你能引用那篇文章和代码片段中最基本的相关部分吗?@Stargateur-hmm,我只是想澄清一个问题。你想让我删除链接吗?删除你的项目和文章:你的问题“是
    String::with_capacity()
    等于
    malloc
    ?”是有意义的。不需要背景。就我个人而言,我不同意投票结果。现在,所需的最少代码片段已经存在。最终,投票被否决的原因可能是缺乏努力:如果你在提问之前搜索了其他资源,问题并没有显示出来。@Stargateur Rust的
    String
    类似于C++的
    std::String
    。C语言中没有类似的结构,所以这样的比较是没有意义的。所以“这不准确”(翻译:否)后面跟它实际上更相似的东西不能回答这个问题?很高兴知道。@Stargateur如果不改进这个问题,我们无法完全确定这是否属实。到目前为止,这个答案已经证明是高质量的,并且从字面意义上解决了这个问题。这当然是一个话题,即使这个问题可能有不同的意图。这个问题可能会问,这是否等于特朗普的发型。我的答案还是一样的。这个问题的明显意图是达到与malloc类似的效果;然而,我要指出的是,malloc的行为并不像他们所期望的那样。一种更类似的方法是获取指向未初始化内存的指针,然而在生锈的情况下,我们会这样做。@Stargateur:唯一能够提出完美问题的人是那些已经知道答案的人——我们必须假设这个问题是不完美的。因此,关注问题的细节而不是问题的意图是错误的,即使OP承认答案是有帮助的,向下投票也是愚蠢的。很好,这个答案澄清了我的问题,谢谢。那么,在Rust中实现类似
    malloc
    的功能的最佳或最准确的方法是什么?(请原谅我用评论扩展我的问题)@AfshinMehrabani很可能,你不想那样做。如果您只需要一个字节缓冲区,
    Vec
    就可以了。为了实现低级数据结构,可以使用不稳定的API,例如。
    pub struct Vec<T> {
        buf: RawVec<T>,
        len: usize,
    }
    
    pub struct RawVec<T> {
        ptr: Unique<T>,
        cap: usize,
    }
    
    pub fn with_capacity(capacity: usize) -> String {
        String { vec: Vec::with_capacity(capacity) }
    }