Viv*_*dav 4 vector heap-memory allocator rust
是否std::vec::shrink_to_fit分配一个新的、较小的vec.len()数据缓冲区,复制到其中,并销毁旧缓冲区,或者是否以某种方式向内存分配器指示可以取消分配缓冲区的未初始化部分,并简单地释放该部分内存?这可能吗?这取决于内存分配器吗?
我很抱歉在这里问一个切题的问题,但如果可能的话,为什么我们不实现从向量前面弹出作为一个简单的“std::mem::size_of<T>()从缓冲区开始释放内存量,并递增我们的指针移动一位”,而不是将所有元素移动一位?
使用Vec::shrink_to_fit()Allocator ::shrink()方法来缩小分配(通过内部RawVec::shrink_to_fit() ),该方法可以简单地就地调整现有分配的大小而不移动数据,或者可能返回不同的内存块。
您无法通过重新调整向量的大小来从向量的前面弹出,因为内存分配无法更改其起始地址,只能更改其长度。
Rust 文档的美妙之处在于您可以亲自查看!Rust 的文档包括整个板条箱的源代码,并且标准库编写得非常好,即使您不是 Rust 大师,您也可以阅读它的源代码并理解它(并从中学到很多东西)。
那么让我们看看你的问题的答案是什么。
shrink_to_fit(self.len)它self.buf的类型RawVecshrink_to_fitfor RawVec。它依次调用下面第 #430RawVec::shrink行实现的内容self.alloc.shrink. 这是一种针对不稳定分配器特性的方法现在这个功能可以由不同的分配器以不同的方式实现。有些可能会进行重新分配,有些可能会执行实际的内存收缩但什么也不做 memmove。要查看您的程序使用什么,您必须了解有关分配器的更多信息。
如果你查看Allocator 的方法,你会发现没有 method shrink_from_start。这是因为该操作并不常见,并且在分配器中实现起来要困难得多。这就是为什么用它来实现Vec::remove(0)没有多大意义。