C 7 2特性 Span介紹

2022-09-21 06:45:07 字數 1198 閱讀 9401

1.

2.3.

.net core 2.1 和 c# 7.2 帶來了 span 的原生支援,原本需要使用不安全**操作的記憶體塊現在可以使用安全的方式來完成。此前在效能和穩定性上需要有所取捨,而現在可以兼得了。

span< t > : 結構體,值型別 。相當於c++ 中的指標,它是一段連續記憶體的引用,也就是一段連續記憶體的首位址。使用的是堆疊記憶體。有了span< t >,我們就可以不在unsafe的**塊中寫指標了。

應用1:允許擷取陣列中的一段,直接通過指標操作。在使用中,span確保了記憶體和資料安全,而且幾乎沒有開銷。

var arr = new

byte[10

];span

bytes =arr;

bytes [

0] = 42;

應用2:高效的字串操作。string.substring() 函式,實際上是在堆中額外建立了乙個新的 string 物件,把字元 copy 過去,再返回這個物件的引用。而相對應的 span< t > 的slice() 函式則是直接在記憶體中返回子串的首位址引用,此過過程幾乎不分配記憶體,並且十分高效。因此可以用來做高效的字串擷取,也可以配合stringbuilder進行高效的字串拼接。注:readonlyspan為唯讀的span。

readonlyspan t = "

abcde

".asspan(2,2

);readonlyspan

t2 = tts.slice(1, 3

);int position =t.indexof(t2);

string s =t.tostring();

stringbuilder sb = new

stringbuilder();

span使用的是堆疊記憶體。所有指向堆疊的指標都不能儲存在託管堆上。因為方法結束時,堆疊會被釋放,指標會變成無效值,如果再使用,就是記憶體溢位。

因此span例項也不能駐留在託管堆上,而只能駐留在堆疊上。這又引出一些限制。

1.span不能作為非堆疊型別的字段

2.span不能有介面實現

3.span不能是非同步方法的引數或區域性變數

4.span不能是泛型的代入引數

以上限制可以使用memory解決,這與處理 span 基本相同,不同之處在於 memory是不類似引用的結構,可以存在於堆上。然後,若要執行同步處理,可以從其屬性中獲取 span。

C 7 2 新增功能

c 7.2 又是乙個單點版本,它增添了大量有用的功能。此版本的一項主要功能是避免不必要的複製或分配,進而更有效地處理值型別。c 7.2 使用語言版本選擇配置元素來選擇編譯器語言版本。01 安全高效的 的增強功能 利用 7.2 中引入的語言功能,可在使用引用語義時處理值型別。它們旨在儘量減少值型別的複...

C 7 2 程式儲存問題(PTA)

題目描述 設有n 個程式要存放在長度為l的磁帶上。程式i存放在磁帶上的長度是 li,1 i n。程式儲存問題要求確定這n 個程式在磁帶上的乙個儲存方案,使得能夠在磁帶上儲存盡可能多的程式。對於給定的n個程式存放在磁帶上的長度,計算磁帶上最多可以儲存的程式數。輸入格式 第一行是2 個正整數,分別表示檔...

解決C 7 2中的結構體效能問題

在某些使用了readonly關鍵字的情況下,c 編譯器會建立出結構體的防禦副本。雖然這個問題已經眾所周知並被記錄下來了,但仍然值得重新審視,因為它與c 7.2的幾個特性有關。in和ref readonly關鍵字的使用讓這個問題出現得更頻繁,而readonly結構體提供了一種解決方法。c 中的結構體通...