简介

.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> 块的扩展方法集

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> 相关类型的更多相关文章

  1. 内存包装类 Memory 和 Span 相关类型

    1. 前言 2. 简介 3. Memory<T>和Span<T>使用准则 3.1. 所有者, 消费者和生命周期管理 3.2. Memory<T> 和所有者/消费者模 ...

  2. java IO操作和计算操作:工作内存和主内存 volatile关键字作用;原子操作对象AtomicInteger ....

    应该停止但无法停止的计算线程 如下线程示例,线程实例中while循环中的条件,在主线程中通过调用实例方法更新后,while循环并没有更新判断变量是否还成立.而是陷入了while(true)死循环. i ...

  3. 【C# IO 操作 】内存之RAM、SRAM、DRAM、ROM、FLASH、SDRAM、DDR*

    内存 内存(Memory)指的是内存存储器,又称为主存,是CPU用来直接寻址和存储的空间,它相当于一座桥梁,用以负责诸如硬盘.主板.显卡等硬件上的数据与处理器之间数据交换处理,我们可以把内存看作数据缓 ...

  4. 内存泄漏(Memory Leak)

    什么情况下会导致内存泄露(Memory Leak)? Android 的虚拟机是基于寄存器的Dalvik,它的最大堆大小一般是16M,有的机器为24M.因此我们所能利用 的内存空间是有限的.如果我们的 ...

  5. FFmpeg内存IO模式(内存区作输入或输出)

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10318145.html 所谓内存IO,在FFmpeg中叫作"buffered ...

  6. 内存泄漏 Memory Leaks 内存优化 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  7. 每天3分钟操作系统修炼秘籍(14):IO操作和DMA、RDMA

    点我查看秘籍连载 I/O操作和DMA.RDMA 用户进程想要执行IO操作时(例如想要读磁盘数据.向磁盘写数据.读键盘的输入等等),由于用户进程工作在用户模式下,它没有执行这些操作的权限,只能通过发起对 ...

  8. RapidIO 逻辑层IO操作与Message操作的原理和区别

    接上一篇 SRIO RapidIO (SRIO)协议介绍(一) 1     说明 查看协议手册时会发现,逻辑层的操作分成了IO和Message 2类动作,那么为什么要分成2类操作?从原理和应用角度来看 ...

  9. python之协程与IO操作

    协程 协程,又称微线程,纤程.英文名Coroutine. 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B ...

随机推荐

  1. unity3d发布安卓出错plese set the package name

    发布时报错 参考https://forum.unity.com/threads/where-is-package-name-setting.318839/ 参考https://answers.unit ...

  2. 快速删除IDEA/WebStrom/Rider中的代码空行

    使用替换 ^\s*\n 并打开正则匹配模式   Visual Studio中未测试,大家可以去试一试

  3. jdbc连接mysql数据库注意事项

    1.导入mysql驱动  http://blog.csdn.net/a153375250/article/details/50851049 2.开放机器访问权限 mysql>GRANT ALL ...

  4. python3 类的学习

    # -*-coding:utf-8-*- # 定义类是通过class关键字,class后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来 ...

  5. python全局解释器GIL锁(-死锁)

    目录 一:Python中的GIL锁 1.GIL介绍 2.GIL的作用 3.cpython 4.内存管理>>>垃圾回收机制 二:全局解释器锁GIL 1.GIL特点 三:计算密集型与IO ...

  6. db2日志模式、备份归档、恢复解析

    DB2的日志分为两种模式,日志循环与归档日志,也就是非归档和归档模式.下面就具体介绍一下这两种方式以及和备份归档设置的关系. 一.日志循环 这是默认方式,也就是非归档模式,这种模式只支持(backup ...

  7. ajaxl利用json 传送数据的 三种提交方式?

    一.在servlet类中添加几个javabean对象,放置数据. package com.aaa.servlet; import java.io.IOException; import java.ut ...

  8. OPENCV中Line2D对象的意义

    这个对象有四个属性值 VY/VX就是直线的斜率,这俩值代表着直线的归一化向量 X,Y就是直线上的任意一点 直线方程计算如下:

  9. NOIP2018 Day2T3 保卫王国

    首先不考虑强制要求的话是一个经典问题,令 \(f_{i, 0 / 1}\) 为 \(i\) 选或不选时以 \(i\) 为根的子树的最优答案.那么就有转移 \(f_{u, 0} = \sum f_{v, ...

  10. AT5760 Manga Market

    首先一个想法就是可以考虑令 \(dp_{i, j}\) 表示当前考虑到了第 \(i\) 个商店,当前到了时刻 \(j\) 能走过最多的商店数量.但是你会发现这个 \(dp\) 转移的顺序并不是简单的从 ...