Rust: Vec类型的into_boxed_slice()方法

这篇具有很好参考价值的文章主要介绍了Rust: Vec类型的into_boxed_slice()方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

比如,我们经常看到Vec类型,但取转其裸指针,经常会看到into_boxed_slice()方法,这是为何?

use std::{fmt, slice};
use std::mem::size_of_val;

#[derive(Clone, Copy)]
struct RawBuffer {
    ptr: *mut u8,
    len: usize,
}

impl From<Vec<u8>> for RawBuffer {
    fn from(vec: Vec<u8>) -> Self {
        let slice = vec.into_boxed_slice();
        Self {
            len: slice.len(),
            // into_raw 之后,Box 就不管这块内存的释放了,RawBuffer 需要处理释放
            ptr: Box::into_raw(slice) as *mut u8,
        }
    }
}

其实,你看标准文档,就很清楚,

pub fn into_boxed_slice(self) -> Box<[T], A>

//Converts the vector into Box<[T]>.

//If the vector has excess capacity, its items will be moved into a newly-allocated buffer with exactly the right capacity.

也就是说,转成了Box<[T]>后,指针所指向的类型,更简短了,丢弃多余的 capacity。
Rust: Vec类型的into_boxed_slice()方法,rust,开发语言,后端

use std::{fmt, slice};
// 从*mut u8 恢复
fn as_ref<'a,T>(pointer: *mut T, len: usize) -> &'a [T] { 
    unsafe { slice::from_raw_parts(pointer, len) } 
}
// 从vec<T>转化Box<[T]>后得到相应的裸指针
fn  get_raw_pointer_from_vec_by_box<T>(vec:Vec<T>) ->*mut T{
    let slice = vec.into_boxed_slice();
    Box::into_raw(slice) as *mut T
}
// 从vec<T>的as_mut_ptr()得到的裸指针
fn get_raw_pointer_from_vec_by_as_mut<T:Copy>( vec:&mut Vec<T>) ->*mut T{

    let ptr = vec.as_mut_ptr();//不能直接用,相当于是一个初始化的指针
    let counts = vec.len();
    let size = vec.capacity();
    // Initialize elements via raw pointer writes, then set length.
    unsafe {
        for i in 0..counts {
            *ptr.add(i) = vec[i];
        }
        vec.set_len(size);
    }
    ptr

}

fn main(){
	//尽管size_of_val只是测试真实占用内存;不包括预分配的内存空间
    let vec_base = vec![1_u8, 2, 3];
    println!("vec_base size of val :{:?}",size_of_val(&vec_base));
    let mut vec = Vec::with_capacity(100);//预分配空间
    vec.extend([1_u8, 2, 3]);
    println!("vec size of val :{:?}",size_of_val(&vec));
    
    let vec0 = vec.clone();
    let slice = vec0.into_boxed_slice() ;// Box<[u8]> ,clone()不会影响vec值的存在
    assert_eq!(slice.clone().into_vec().capacity(), 3); // slice clone后不会影响slice值存在
    
    // 指针类型1:通过box[T]->转换成&[T]
    let  vec1 = vec.clone();
    let pointer_from_box = get_raw_pointer_from_vec_by_box(vec1);//获得相应的*mut u8
    let slice_object_from_box = as_ref(pointer_from_box,slice.len()) ;
    println!("slice_object_from_box :{:?}  ",slice_object_from_box);

    // 指针类型2:通过 as_mut 直接转 *mut T,再转换成&[T]
    let mut vec2 = vec.clone();
    let pointer_from_as_mut = get_raw_pointer_from_vec_by_as_mut(&mut vec2);
    let slice_object_from_as_mut = as_ref(pointer_from_as_mut,vec.len());//vec.capacity()) ;
    println!("slice_object_from_as_mut: {:?} ",slice_object_from_as_mut);
    
}


看看输出了啥?

     Running `target/debug/playground`

Standard Output

vec_base size of val :24
vec size of val :24
slice_object_from_box :[1, 2, 3]  
slice_object_from_as_mut: [1, 2, 3] 

上面,还可以看到,实际分配内存和预分配内存不一样。文章来源地址https://www.toymoban.com/news/detail-619517.html

到了这里,关于Rust: Vec类型的into_boxed_slice()方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Rust中的into函数和from函数

    1.Rust中的into函数和from函数是做什么用的?   into 函数是Rust语言中的一个转换函数,它属于 Into  trait。它可以将一个类型转换为另一个类型。实现了 From  trait的类型会自动获得 Into  trait的实现,因此通常建议实现 From 而不是直接实现 Into 。例如,我们可以很容易地将一个 

    2023年04月11日
    浏览(34)
  • Rust中的 into和from如何使用?

    1.Rust中的into函数和from函数是做什么用的?   into 函数是Rust语言中的一个转换函数,它属于 Into  trait。它可以将一个类型转换为另一个类型。实现了 From  trait的类型会自动获得 Into  trait的实现,因此通常建议实现 From 而不是直接实现 Into 。例如,我们可以很容易地将一个 

    2023年04月11日
    浏览(32)
  • rust持续学习Box::leak

    Box就是unique_ptr 这个函数的功能是消费box返回一个全局变量! 写一个函数,想要真的返回全局变量,感觉用这个是个好的做法 这样就能当真拿到这个全局变量了 还有一种是lazy macro use lazy_static::lazy_static; 然后包在里面 这是圣经里的例子

    2024年02月15日
    浏览(44)
  • rust踩雷笔记(4)——刷点Vec相关的题(持续更新)

    俗话说,孰能生巧,今天是第六天接触Rust,感觉基础语法和特性没什么问题了(当然如果你整天都学这个可能2天半就够了),但是想达到熟练使用,还需要刷点题。算法我相信能来看rust博客的人都是大牛(只有我最菜),应该只有数据结构的困扰,所以接下来的博客会侧重

    2024年02月12日
    浏览(35)
  • Rust 原始类型之数组array内置方法

    目录 数组 array 声明 访问 引用 Reference 切片 Slice 方法 题目实例 在 Rust 中,数组是一种固定大小的数据结构,用于存储具有相同数据类型的元素的有序集合。 “固定大小”是指数组中的元素的类型和数量确定,也就确定了整数数组的大小。 数组可以在声明时指定长度,声明

    2024年02月10日
    浏览(50)
  • Rust中的iter(), into_iter(), iter_mut()

    在Rust中, iter() , into_iter() , iter_mut() 都是用于在集合类型上创建迭代器的方法。这三个方法各有不同,下面一一进行介绍。 iter() : iter() 方法创建一个不可变的引用迭代器。当你只想读取集合中的元素,而不想改变它们或消耗集合时,应使用 iter() 。 iter() 返回的迭代器将生成

    2024年02月15日
    浏览(29)
  • Rust 标准库字符串类型String及其46种常用方法

    Rust主要有两种类型的字符串:str和String str 由[u8]表示,UTF-8编码的字符串的引用,字符串字面值,也称作字符串切片。&str用于查看字符串中的数据。它的大小是固定的,即它不能调整大小。 String String 类型来自标准库,它是可修改、可变长度、可拥有所有权的同样使用UTF

    2024年02月07日
    浏览(98)
  • 【Rust】枚举类型创建单链表以及常见的链表操作方法

    目录 单链表 用枚举表达链表 枚举enum Box容器 创建节点 1. 创建并打印 2. match 匹配 3. 节点初始化 4.节点嵌套 追加节点 1. 尾插法 2. 链表追加方法 3. 头插法 4. 改写成单链表方法 遍历链表 1. 递归法 2. 递推法 3. 改写成单链表方法  自定义Display trait 创建链表 1. 递归法 2. 递推法

    2024年02月15日
    浏览(41)
  • 盒子(Box, ACM/ICPC NEERC 2004, UVa1587)rust解法

    给定6个矩形的长和宽wi和hi(1≤wi,hi≤1000),判断它们能否构成长方体的6个面。 样例 解法

    2024年02月07日
    浏览(37)
  • Rust踩雷笔记(5)——刷点链表的题(涉及智能指针Box,持续更新)

    只能说Rust链表题的画风和C++完全不一样,作为新手一时间还不太适应,于是单独为链表、智能指针开一篇,主要记录leetcode相关题型的答案以及注意事项。 🍑关键操作 as_ref() 将 OptionT 、 OptionT 或者 mut OptionT 转换为 OptionT as_mut() 将 OptionT 、 mut OptionT 转换为 Optionmut T ,不能对

    2024年02月11日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包