美团网站除佣金表格怎么做,成都网页设计与网站建设,网站开发公司创业策划,品牌故事经典案例过年啦#xff0c;写个短点的。同时#xff0c;提前给大家拜个年。总有小伙伴们跑过来讨论关于Span和Memory的使用#xff0c;眼瞅是最近关于Span的文章有点多#xff0c;看飞了。今天写这个#xff0c;就是往回拉一拉。写之前#xff0c;先声明一下。这些内容是我自己使… 过年啦写个短点的。同时提前给大家拜个年。 总有小伙伴们跑过来讨论关于Span和Memory的使用眼瞅是最近关于Span的文章有点多看飞了。今天写这个就是往回拉一拉。写之前先声明一下。这些内容是我自己使用的一些经验并不代表这些类的全部内容就是这些只是说我是这么用的而且用得很好。1. SpanSpan在我的概念中就是一个快速的同步访问器。就这么简单。Span很快。在我前边关于Span的文章中分析过可以移步【传送门】去看。而且它与foreach一起使用也很快主要是因为Span的GetEnumerator使用了引用返回。你看Span本身就被设计成了一个非常快的东西。同时Span是同步的。也就是说它没有提供任何异步的方法和属性。说到为什么Span是同步的这倒是一个问题。我们需要从根上来找找。Span背后的连续内存块主要来自于以下几个方面数组的切片Memory非托管指针void*stackalloc其中第一个是堆上分配的数组的一部分。第二个是基于连续内存的。第三个非托管void*本身就是同步的。第四个单独说一下。stackalloc提供的是在线程的堆栈上分配内存。如果Span可以使用异步会导致一个线程可以访问另一个线程的堆栈。显然这是不安全和不合理的。所以保持Span同步是必须的。所以Span就是一个性能非常好的针对连续内存的同步访问器。2. MemoryMemory就是一个实际的内存块。与Span不同Memory可以在异步流中使用同时它还提供了获取同步访问器的方法MemoryT.Span()。Memory可以有多种来源例如数组切片MemoryMarshal的各种Create方法例如MemoryMarshal.CreateFromPinnedArray()这样的。第一个是最基本的用法从数组T[]中取一个切片成为Memory。第二个方法会复杂一些用了一个特殊的方法来创建Memory。像上边的例子CreateFromPinnedArray用了一个已经固定的数组。在Dotnet中可以通过固定一个对象来禁止GC移动对象。这在将Memory传递给非托管对象时非常有用。总之Memory就是一个实际的内存块。这个内存块可以被用到任何地方并可以使用它的同步访问器Span进行访问。3. ReadOnlyX印象中有三种ReadOnlySpan、ReadOnlyMemory、ReadOnlySequence。没什么特别的就是ReadOnly只读啦。前两个ReadOnlySpan、ReadOnlyMemory就是Span和Memory对应的只读对象。4. ReadOnlySequenceReadOnlySequence也不算复杂就是一个ReadOnlyMemory元素的序列。基于操作系统的内存管理有时候Memory不是连续的可能会分片段所以就需要有个结构来表示一个Memory链/Memory列表类似的序列。这是ReadOnlySequence的由来而它本身也是一个ReadOnlyMemory的列表。同时它也提供了一些属性来优化序列中包含一个元素的情况IsSingleSegment用来快速检查是否只包含一个内存项FirstSpan该速访问ReadOnlySpan访问器的第一个内存项因此虽然被定义为序列但处理单个元素例如单个Span或Memory也容易很多。 这就是今天的全部内容了。有没有跟你用的不一样 文章最后再次祝大家牛年大吉万事胜意喜欢就来个三连让更多人因你而受益