【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 ...
随机推荐
- unity3d发布安卓出错plese set the package name
发布时报错 参考https://forum.unity.com/threads/where-is-package-name-setting.318839/ 参考https://answers.unit ...
- 快速删除IDEA/WebStrom/Rider中的代码空行
使用替换 ^\s*\n 并打开正则匹配模式 Visual Studio中未测试,大家可以去试一试
- jdbc连接mysql数据库注意事项
1.导入mysql驱动 http://blog.csdn.net/a153375250/article/details/50851049 2.开放机器访问权限 mysql>GRANT ALL ...
- python3 类的学习
# -*-coding:utf-8-*- # 定义类是通过class关键字,class后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来 ...
- python全局解释器GIL锁(-死锁)
目录 一:Python中的GIL锁 1.GIL介绍 2.GIL的作用 3.cpython 4.内存管理>>>垃圾回收机制 二:全局解释器锁GIL 1.GIL特点 三:计算密集型与IO ...
- db2日志模式、备份归档、恢复解析
DB2的日志分为两种模式,日志循环与归档日志,也就是非归档和归档模式.下面就具体介绍一下这两种方式以及和备份归档设置的关系. 一.日志循环 这是默认方式,也就是非归档模式,这种模式只支持(backup ...
- ajaxl利用json 传送数据的 三种提交方式?
一.在servlet类中添加几个javabean对象,放置数据. package com.aaa.servlet; import java.io.IOException; import java.ut ...
- OPENCV中Line2D对象的意义
这个对象有四个属性值 VY/VX就是直线的斜率,这俩值代表着直线的归一化向量 X,Y就是直线上的任意一点 直线方程计算如下:
- NOIP2018 Day2T3 保卫王国
首先不考虑强制要求的话是一个经典问题,令 \(f_{i, 0 / 1}\) 为 \(i\) 选或不选时以 \(i\) 为根的子树的最优答案.那么就有转移 \(f_{u, 0} = \sum f_{v, ...
- AT5760 Manga Market
首先一个想法就是可以考虑令 \(dp_{i, j}\) 表示当前考虑到了第 \(i\) 个商店,当前到了时刻 \(j\) 能走过最多的商店数量.但是你会发现这个 \(dp\) 转移的顺序并不是简单的从 ...