【C# IO 操作 】内存包装类 Memory <T>和 Span<T> 相关类型
简介
.NET 包含多个相互关联的类型,它们表示任意内存的连续的强类型区域。 这些方法包括:
System.Span<T>- 用于访问连续的内存区域
- 得到该类型的实例:
- 1个T类型的数组
- 1个
String - 1个使用
stackalloc分配的缓冲区 - 1个指向非托管内存的指针
- 实例必须存储在堆栈(stack)上,因此有很对限制
- 类的字段不能是此类型
- 不能在异步操作中使用
System.ReadOnlySpan<T>Span<T>结构体的不可变版本
System.Memory<T>- 连续的内存区域的包装器
- 实例创建
T类型数组String- 内存管理器
- 实例可以存储在托管堆(managed heap)上,所以它没有
Span<T>的限制
System.ReadOnlyMemory<T>Memory<T>结构的不可变版本。
System.Buffers.MemoryPool<T>- 它将强类型内存块从内存池分配给所有者
IMemoryOwner<T>实例可以通过调用MemoryPool<T>.Rent从池中租用- 通过调用
MemoryPool<T>.Dispose()将其释放回池中
- 它将强类型内存块从内存池分配给所有者
System.Buffers.IMemoryOwner<T>- 表示内存块的所有者,管理其生命周期
MemoryManager<T>- 一个抽象基类,可用于替换
Memory<T>的实现,以便Memory<T>可以由其他类型(如安全句柄(safe handles))提供支持 - MemoryManager<T> 适用于高级方案。
- 一个抽象基类,可用于替换
ArraySegment<T>- 是数组的包装,对应数组中,从特定索引开始的特定数量的一系列元素
System.MemoryExtensions- 用于将String、数组和数组段(
ArraySegment<T>)转换为Memory<T>块的扩展方法集
- 用于将String、数组和数组段(
System.Span<T>、System.Memory<T> 及其对应的只读类型被设计为:
- 避免不必要地复制内存或在托管堆上进行内存分配
- 通过
Slice方法或这些类型的的构造函数创建它们, 并不涉及复制底层缓冲(underlying buffers): 只更新相关引用和偏移- 形象的说就是,只更新我们可以访问到的内存的位置和范围,而不是将这些内存数据复制出来
备注:
对于早期框架,Span<T>和Memory<T>在 System.Memory NuGet 包中提供。
使用 memory 和 span
- 由于 memory 和 span 相关类型通常用于在处理 pipeline 中存储数据,因此开发人员在使用
Span<T>、Memory<T>和相关类型时要务必遵循一套最佳做法。Memory<T>和Span<T>使用准则中介绍了这些最佳做法。
【C# IO 操作 】内存包装类 Memory <T>和 Span<T> 相关类型的更多相关文章
- 内存包装类 Memory 和 Span 相关类型
1. 前言 2. 简介 3. Memory<T>和Span<T>使用准则 3.1. 所有者, 消费者和生命周期管理 3.2. Memory<T> 和所有者/消费者模 ...
- java IO操作和计算操作:工作内存和主内存 volatile关键字作用;原子操作对象AtomicInteger ....
应该停止但无法停止的计算线程 如下线程示例,线程实例中while循环中的条件,在主线程中通过调用实例方法更新后,while循环并没有更新判断变量是否还成立.而是陷入了while(true)死循环. i ...
- 【C# IO 操作 】内存之RAM、SRAM、DRAM、ROM、FLASH、SDRAM、DDR*
内存 内存(Memory)指的是内存存储器,又称为主存,是CPU用来直接寻址和存储的空间,它相当于一座桥梁,用以负责诸如硬盘.主板.显卡等硬件上的数据与处理器之间数据交换处理,我们可以把内存看作数据缓 ...
- 内存泄漏(Memory Leak)
什么情况下会导致内存泄露(Memory Leak)? Android 的虚拟机是基于寄存器的Dalvik,它的最大堆大小一般是16M,有的机器为24M.因此我们所能利用 的内存空间是有限的.如果我们的 ...
- FFmpeg内存IO模式(内存区作输入或输出)
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10318145.html 所谓内存IO,在FFmpeg中叫作"buffered ...
- 内存泄漏 Memory Leaks 内存优化 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 每天3分钟操作系统修炼秘籍(14):IO操作和DMA、RDMA
点我查看秘籍连载 I/O操作和DMA.RDMA 用户进程想要执行IO操作时(例如想要读磁盘数据.向磁盘写数据.读键盘的输入等等),由于用户进程工作在用户模式下,它没有执行这些操作的权限,只能通过发起对 ...
- RapidIO 逻辑层IO操作与Message操作的原理和区别
接上一篇 SRIO RapidIO (SRIO)协议介绍(一) 1 说明 查看协议手册时会发现,逻辑层的操作分成了IO和Message 2类动作,那么为什么要分成2类操作?从原理和应用角度来看 ...
- python之协程与IO操作
协程 协程,又称微线程,纤程.英文名Coroutine. 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B ...
随机推荐
- 【Python爬虫】爬虫利器 requests 库小结
requests库 Requests 是一个 Python 的 HTTP 客户端库. 支持许多 HTTP 特性,可以非常方便地进行网页请求.网页分析和处理网页资源,拥有许多强大的功能. 本文主要介绍 ...
- Java 重写paint绘图
感谢原文:https://zhidao.baidu.com/question/260060153.html 这个方法需要注意的地方不多,也就是重写时,先调用 super.paint(g) 方法 pai ...
- visual studio版本 宏
转载请注明来源:https://www.cnblogs.com/hookjc/ MSVC++ 12.0 _MSC_VER == 1800 (Visual Studio 2013) MSVC++ 11. ...
- _call妙用
class Magic { function __call($name,$arguments) { if($name=='foo') { if(is_int($arguments[0])) $this ...
- 简单仿京东"筛选"界面 双导航栏控制器共存 by Nicky.Tsui
大概就是这么一个效果 如图.大概可以看到,"筛选"视图后面有一层视图盖住了后面原来的视图 那么我们可以通过加一个view到导航栏控制器的view里面来实现 //该view作为全局变 ...
- 有手就行7——*项目构建细节2-钩子(webhook) 配置
有手就行7--*项目构建细节2-钩子(webhook) 配置 钩子服务 1)开启webhook功能 使用root账户登录到后台,点击Admin Area -> Settings -> N ...
- sql与数据库
sql的优化: 1.对查询进行优化,要尽量避免全表扫描,首先应考虑在进行条件判断的字段上创建索引 2.尽量避免在WHERE字句中对字段进行NULL值判断,否则将导致引擎放弃使用索引而进行全表扫描 3. ...
- 从服务间的一次调用分析整个springcloud的调用过程(二)
先看示例代码 @RestController @RequestMapping("/students") public class StudentController { @Auto ...
- netty系列之:不用怀疑,netty中的ByteBuf就是比JAVA中的好用
目录 简介 ByteBuf和ByteBuffer的可扩展性 不同的使用方法 性能上的不同 总结 简介 netty作为一个优秀的的NIO框架,被广泛应用于各种服务器和框架中.同样是NIO,netty所依 ...
- Solution -「HDU 6643」Ridiculous Netizens
\(\mathcal{Description}\) Link. 给定一棵含有 \(n\) 个结点的树,点 \(u\) 有点权 \(w_u\),求树上非空连通块的数量,使得连通块内点权积 \(\ ...