std::vec::shrink_to_fit分配一个新的、更小的vec.len()数据缓冲区,复制到它,然后销毁旧缓冲区,还是它以某种方式向内存分配器指示可以释放缓冲区的未初始化部分,并简单地释放该部分内存?这有可能吗?这取决于内存分配器吗?

我很抱歉在这里问一个离题的问题,但如果这是可能的,为什么我们不实现从向量的前面弹出,例如,简单地将从缓冲区开始释放std::mem::size_of<T>()个内存量,并将指针递增1,而不是将所有元素移位1?

推荐答案

Vec::shrink_to_fit()使用Allocator::shrink()方法来缩减分配(通过内部RawVec::shrink_to_fit()方法,该方法可以简单地就地调整现有分配的大小而不移动数据,或者它可以返回不同的存储块.

您不能通过调整向量的大小来从其前面弹出,因为内存分配不能更改其起始地址,只能更改其长度.

Rust相关问答推荐

as操作符如何将enum转换为int?

计算具有相邻调换且没有插入或删除的序列的距离

即使参数和结果具有相同类型,fn的TypId也会不同

是否可以为`T:Copy`执行`T. clone`的测试

将内部类型作为参数的泛型 struct 上的方法

如果A == B,则将Rc A下推到Rc B

使用 struct 外部的属性来改变 struct 的原始方式

新创建的变量的绑定生存期

如何格式化传入Rust中mysql crate的Pool::new的字符串

将PathBuf转换为字符串

有没有可能让泛型Rust T总是堆分配的?

无法将 rust 蚀向量附加到另一个向量

如何在Rust中缩短数组

用于实现获取 struct 体 id 的特征规范

在 Rust 中,在需要引用 self 的 struct 体方法中使用闭包作为 while 循环条件

确保参数是编译时定义的字符串文字

将 Futures 的生命周期特征绑定到 fn 参数

从现有系列和 map 值创建新系列

试图理解 Rust 中的可变闭包

If let expression within .iter().any