Rust: Vec类型的into_boxed_slice()方法

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

use std::{fmt, slice};#[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]>后,指针所指向的类型,更简短了。

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(){let mut vec = Vec::with_capacity(10);vec.extend([1_u8, 2, 3]);//查看into_boxed_slice()后堆上数据的空间情况assert!(vec.capacity() >= 10);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 u8let 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 Outputslice_object_from_box :[1, 2, 3]  
slice_object_from_as_mut: [1, 2, 3] 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/11175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

垃圾回收之三色标记法(Tri-color Marking)

关于垃圾回收算法&#xff0c;基本就是那么几种&#xff1a;标记-清除、标记-复制、标记-整理。在此基础上可以增加分代&#xff08;新生代/老年代&#xff09;&#xff0c;每代采取不同的回收算法&#xff0c;以提高整体的分配和回收效率。 无论使用哪种算法&#xff0c;标记…

【libevent】http客户端2:使用post 发送本地文件到服务器

HttpClient2POST的例子 看起来只post了一次?#include <stdio.h> #include <assert.h> #include <stdlib.h> #include

深入浅出Pytorch函数——torch.maximum

分类目录&#xff1a;《深入浅出Pytorch函数》总目录 相关文章&#xff1a; 深入浅出Pytorch函数——torch.max 深入浅出Pytorch函数——torch.maximum 计算input和other的元素最大值。 语法 torch.maximum(input, other, *, outNone) -> Tensor参数 input&#xff1a;…

C# OpenCvSharpe 二值化工具 阈值 自适应阈值 局部阈值 InRange

效果 阈值 自适应阈值 局部阈值 InRange 项目 VS2010.net4.0OpenCvSharper3 Demo下载

Educational Codeforces Round 152 (Rated for Div. 2)

B. Monsters 题意&#xff1a;你的攻击力为k&#xff0c;你优先攻击血量最多的怪物&#xff0c;血量相同击杀编号小的&#xff0c;问怪物被击杀的顺序&#xff0c; 思路&#xff1a;我们可以知道最后肯定存在一个状态&#xff0c;所有怪物就差一次攻击就死了&#xff0c;这个…

AWS / VPC 云流量监控

由于安全性、数据现代化、增长、灵活性和成本等原因促使更多企业迁移到云&#xff0c;将数据存储在本地的组织正在使用云来存储其重要数据。亚马逊网络服务&#xff08;AWS&#xff09;仍然是最受追捧和需求的服务之一&#xff0c;而亚马逊虚拟私有云&#xff08;VPC&#xff0…

LED芯片 VAS1260IB05E 带内部开关LED驱动器 汽车硬灯带灯条解决方案

VAS1260IB05E深力科LED芯片是一种连续模式电感降压转换器&#xff0c;设计用于从高于LED电压的电压源高效驱动单个或多个串联连接的LED。该设备在5V至60V之间的输入电源下工作&#xff0c;并提供高达1.2A的外部可调输出电流。包括输出开关和高侧输出电流感测电路&#xff0c;该…

UE4/5C++多线程插件制作(十七、封装协程管理)

目录 MTPThreadInterface.h MTPManageBase.h MTPCoroutinesManage.h MTPManage.cpp MTPManage.h 添加继承: cpp实现: MTPThreadTaskMan

双系统的一些设置

1、windows和ubuntu双系统时间不同步的问题&#xff1a; 在安装Windows和Ubuntu双系统时&#xff0c;两个操作系统会分别使用自己的时间设置。Windows默认使用本地时间&#xff08;Local Time&#xff09;&#xff0c;而Ubuntu则默认使用协调世界时&#xff08;Coordinated Un…

TypeScript 在前端开发中的应用实践

TypeScript 在前端开发中的应用实践 TypeScript 已经成为前端开发领域越来越多开发者的首选工具。它是一种静态类型的超集&#xff0c;由 Microsoft 推出&#xff0c;为开发者提供了强大的静态类型检查、面向对象编程和模块化开发的特性&#xff0c;解决了 JavaScript 的动态类…

趋动科技携手星辰天合,推出针对人工智能领域的两款联合解决方案

近日&#xff0c;趋动科技与 XSKY星辰天合联合宣布&#xff0c;结合双方优势能力和产品&#xff0c;携手推出高性能数据湖一站式方案及全协议存算一体化方案&#xff0c;帮助客户简化 AI 工作的 IT 基础设施部署&#xff0c;实现 AI 相关工作更加灵活和便捷。 全协议存算一体化…

janus-Gateway的服务端部署

janus-Gateway 需求是前后端的webRTC推拉流&#xff0c;但是后端用的是c&#xff0c;于是使用了这个库做视频流的推送和拉取&#xff0c;记录踩坑过程。 如果你也需要自己部署janus的服务端并在前端拉流测试&#xff0c;希望对你有所帮助。 由于janus的服务器搭建需要linux环境…

树莓派Pico|RP2040|官方文档|在MS Windows上构建“Hello World”及环境配置

9.2. 在MS Windows上构建 在Microsoft Windows 10或Windows 11上安装工具链与其他平台有些不同。然而安装后&#xff0c;RP2040的构建代码基本类似。  警告 官方不支持在Windows 7或8上使用Raspberry Pi Pico&#xff0c;但在Windows 7或8上可以使其工作。 9.2.1. 安装工具…

docker中设置容器健康检查

文章目录 一、docker-compose方式二、Dockerfile方式三、docker run方式四、查看检查日志 一、docker-compose方式 在docker-compose中加入healthcheck healthcheck 支持下列选项&#xff1a; test&#xff1a;健康检查命令&#xff0c;例如 ["CMD", "curl&quo…

向npm注册中心发布包(上)

目录 1、创建package.json文件 1.1 fields 字段 1.2 Author 字段 1.3 创建 package.json 文件 1.4 自定义 package.json 的问题 1.5 从当前目录提取的默认值 1.6 通过init命令设置配置选项 2、创建Node.js 模块 2.1 创建一个package.json 文件 2.2 创建在另一个应用程…

5G时代的APP开发:机遇与挑战

APP开发是互联网行业中的重要组成部分&#xff0c;随着5G时代的到来&#xff0c;移动 APP开发也迎来了新的机遇和挑战。 5G时代不仅会为移动 APP开发带来新的发展机遇&#xff0c;也会给移动 APP开发带来新的挑战。对于企业和开发者而言&#xff0c;5G时代带来的机遇和挑战是并…

【雕爷学编程】MicroPython动手做(02)——尝试搭建K210开发板的IDE环境5

#尝试搭建K210的Micropython开发环境&#xff08;Win10&#xff09; #实验程序之三&#xff1a;更新频率演示 #尝试搭建K210的Micropython开发环境&#xff08;Win10&#xff09; #实验程序之三&#xff1a;更新频率演示from Maix import freqcpu_freq, kpu_freq freq.get() …

redis数据库与主从复制

目录 一 基本操作 二 执行流程 三 reids持久化 四 rdb和aof持久化的过程 五 为什么会有内存碎片 六 redis组从复制 一 基本操作 set :存放数据 例如 set 键值 内容 set k kokoko k就是键值 kokoko就是内容 get:获取数据 例如 get k 就会出来 k对应的数据 keys 查询键…

向量数据库

向量数据库 什么是向量数据库&#xff1f; 向量数据库是一种为了高效存储和索引AI模型产生的向量嵌入数据而专门设计的数据库。 在传统的关系型数据库中&#xff0c;数据通常以表格的形式存储&#xff0c;而在向量数据库中以向量的形式存储。向量是一组数值&#xff0c;可以表…

SFP3012A-ASEMI代理海矽美(MHCHXM)快恢复二极管

编辑&#xff1a;ll SFP3012A-ASEMI代理海矽美&#xff08;MHCHXM&#xff09;快恢复二极管 型号&#xff1a;SFP3012A 品牌&#xff1a;ASEMI 芯片个数&#xff1a;1 芯片尺寸&#xff1a;102MIL*2 封装&#xff1a;TO-247AC 恢复时间&#xff1a;75ns 工作温度&#…