欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

.net中的Span<T>類和Memory<T>類介紹

 更新時(shí)間:2022年07月01日 11:11:56   作者:天方  
這篇文章介紹了.net中的Span<T>類和Memory<T>類,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

.net core 2.1的重頭戲就是性能,其中最重要的兩個(gè)類就是span和memory,本文這里簡(jiǎn)單的介紹一下這兩個(gè)類的使用。

什么是 Span<T>

Span<T> 是新一種新值類型。它表示一段連續(xù)的區(qū)域,它通常和數(shù)組關(guān)聯(lián),表示數(shù)組中的一部分內(nèi)存。

var arr =?new?byte[10];
Span<byte>?bytes?=?arr;

也可以取數(shù)組中的一部分:

var?bytes?=?new?Span<byte>(arr,?3,?5);

初一乍看,span<T>和ArraySegment<T>非常類似,但span更加強(qiáng)大得多,它不但能用于分離數(shù)組,還可以引用棧上的數(shù)據(jù)。

Span<byte>?bytes?=?stackalloc?byte[2];

也可以引用指針數(shù)據(jù),

Span<byte>?bytes;
unsafe?{?bytes?=?new?Span<byte>((byte*)ptr,?1);?}

另外,span還支持 reinterpret_cast 的理念,即可以將 Span<byte> 強(qiáng)制轉(zhuǎn)換為 Span<int>,配合MemoryMarshal類使用,span<T>大多數(shù)的時(shí)候都可以代替指針了。

除了功能更加強(qiáng)大外,span在bcl庫(kù)中也得到了更多的支持,大多數(shù)支持?jǐn)?shù)組的函數(shù)現(xiàn)在基本上都能直接支持span了,如:

var?inputSpan?=?input.AsSpan();
int?first =?int.Parse(inputSpan.Slice(3,?5));

這個(gè)函數(shù)中,int.Parse函數(shù)就能直接支持span,并且由于不產(chǎn)生子字符串,比使用substring的方法性能更高。

另外,系統(tǒng)也支持?jǐn)?shù)組類型到span的隱式轉(zhuǎn)換,同時(shí)提供了AsSpan的顯示擴(kuò)展方法,方便將數(shù)組類型轉(zhuǎn)換為span。

除了功能強(qiáng)大外,span的性能也是非常高的,對(duì)span的操作基本上和訪問(wèn)數(shù)組一樣高,無(wú)需通過(guò)計(jì)算來(lái)確定指針開(kāi)頭及其起始偏移,因?yàn)?quot;引用"字段本身已對(duì)兩者進(jìn)行了封裝。相比之下,ArraySegment<T> 有單獨(dú)的偏移字段,這就增加了索引編制和數(shù)據(jù)傳遞操作的成本。

什么是 Memory<T>

Span<T>雖然強(qiáng)大而好用,但它只能存在于棧上,而不能存在于堆上,原因主要有如下兩點(diǎn):

  • span包含"引用"字段(如數(shù)組的開(kāi)頭),這些引用被稱為"內(nèi)部指針"。對(duì)于 .NET 運(yùn)行時(shí)的垃圾回收器,跟蹤這些指針是一項(xiàng)成本相對(duì)高昂的操作。因此,運(yùn)行時(shí)將這些引用約束為僅存在于堆棧上,因?yàn)樗[式規(guī)定了可以存在的內(nèi)部指針數(shù)量下限。
  • 對(duì) Span 執(zhí)行的讀取和寫(xiě)入操作不是原子操作。如果多個(gè)線程同時(shí)對(duì) Span 在堆上的字段執(zhí)行讀取和寫(xiě)入操作,存在"撕裂"風(fēng)險(xiǎn)。

這個(gè)限制決定了無(wú)法將 Span 裝箱,進(jìn)而無(wú)法將 Span<T> 與現(xiàn)有反射調(diào)用 API結(jié)合使用,也無(wú)法作為泛型參數(shù)。

對(duì)于大部分同步處理功能,這個(gè)并沒(méi)有太大的影響,但由于span<T>無(wú)法存儲(chǔ)到堆,從而導(dǎo)致其無(wú)法在異步上下文中使用。為了解決這個(gè)問(wèn)題,.net引入了一個(gè)新類型Memory<T>。

Memory和span的使用方法大同小異,

var?arr =?new?byte[10];
var?bytes?=?new?Memory<byte>(arr,?3,?5);

不同之處在于 Memory<T> 是不類似引用的結(jié)構(gòu),可以存在于堆上。.net bcl庫(kù)對(duì)memory也做了很好的支持,如Stream.ReadAsync就能直接支持memory<byte>作為參數(shù)。

另外,也可以從Memory的Span屬性創(chuàng)建指向該Memory的span,這樣也可以使用span的強(qiáng)大的功能。

參考文章:

C# - Span 全面介紹:探索 .NET 新增的重要組成部分

到此這篇關(guān)于.net中Span<T>類和Memory<T>類的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • WPF圖表LiveChart使用詳解

    WPF圖表LiveChart使用詳解

    本文詳細(xì)講解了WPF圖表LiveChart的用法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • 詳解ABP框架中Session功能的使用方法

    詳解ABP框架中Session功能的使用方法

    ABP(ASP.NET Boilerplate Project)是基于ASP.NET框架的一個(gè)Web開(kāi)發(fā)框架,這里我們來(lái)詳解ABP框架中Session功能的使用方法,需要的朋友可以參考下
    2016-06-06
  • ASP.NET中 ListBox列表框控件的使用方法

    ASP.NET中 ListBox列表框控件的使用方法

    本文主要介紹ListBox控件的使用方法,ListBox控件可以一次顯示多個(gè)項(xiàng),而且可以允許用戶一次選擇多個(gè)項(xiàng)。
    2016-04-04
  • .Net中的不可變集合(Immutable Collection)程序集簡(jiǎn)介

    .Net中的不可變集合(Immutable Collection)程序集簡(jiǎn)介

    這篇文章介紹了.Net中的不可變集合(Immutable Collection)程序集,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Asp.net請(qǐng)求處理之管道處理介紹

    Asp.net請(qǐng)求處理之管道處理介紹

    在了解Asp.net請(qǐng)求處理流程的過(guò)程中,個(gè)人認(rèn)為有必要從源代碼的角度來(lái)了解asp.net管道是怎么實(shí)現(xiàn)的,需要的朋友可以參考下
    2012-11-11
  • .Net創(chuàng)建型設(shè)計(jì)模式之原型模式(Prototype)

    .Net創(chuàng)建型設(shè)計(jì)模式之原型模式(Prototype)

    這篇文章介紹了.Net設(shè)計(jì)模式之原型模式(Prototype),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • 常用C#關(guān)鍵字詳解教程(比較全面)

    常用C#關(guān)鍵字詳解教程(比較全面)

    學(xué)習(xí)C#很久了,但可能你也和我一樣,總有那么一兩個(gè)關(guān)鍵詞,說(shuō)不清楚它是什么意思,有什么用,那么這篇文章就帶你一一講解。
    2016-04-04
  • ASP.NET?Core命令行界面CLI用法

    ASP.NET?Core命令行界面CLI用法

    這篇文章介紹了ASP.NET?Core命令行界面CLI的用法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • ASP.NET?Core?MVC中的布局(Layout)

    ASP.NET?Core?MVC中的布局(Layout)

    這篇文章介紹了ASP.NET?Core?MVC中的布局(Layout),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • .Net行為型設(shè)計(jì)模式之訪問(wèn)者模式(Visitor)

    .Net行為型設(shè)計(jì)模式之訪問(wèn)者模式(Visitor)

    這篇文章介紹了.Net行為型設(shè)計(jì)模式之訪問(wèn)者模式(Visitor),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05

最新評(píng)論