2023-09-01 10:18:48來源:一線碼農聊技術
把 Span 歸于語法糖,可能有些偏了,但偏了就偏了,哈哈,只要是分享就好,C# 發展至今,已經是一門非常重的語言了,所有想要的它都要,即可以:
面向過程編程面向對象編程面向函數式編程面向異步編程面向泛型編程既能做到高開發效率,又能做到高性能編程。
這里的Span就歸結于高性能編程這個范疇了。
(資料圖片僅供參考)
當年的 C# 一個亮點就是屏蔽了指針,自動內存托管,可以讓程序員更加專注于業務,現如今策略變了,C# 要變得更加高性能,既然要做高性能那必然少不了指針,而指針又是面向托管層編程的程序員最怕的東西,所以就盡可能的封裝,弄一套屬于自己的托管指針玩法。
Span即屬于托管指針玩法的一個典型代表,如果你用 ILSpy 去看它的struct結構,本質上就兩個成員,一個叫_pointer,一個叫_length,參考如下代碼:
public readonly ref struct Span { internal readonly ByReference _pointer; private readonly int _length; }
pointer 是指定起點, length 是控制邊界,如果用 C 來模擬,大概就是這個樣子。
struct Span { void* ptr; int length;};
畫個圖大概就是這樣子。
圖片
二:Span 的場景在哪里有了指針,就可以對內存進行原地操作,只要能原地操作,那就可以破掉語言層面上的諸多限制,實現接近C/C++級的高性能,有些朋友可能要問了,語言層面有什么限制?比如最典型的string,大家都知道string是一個writeoncopy特性的字符串,只要你動它一下,它就會繁殖,接下來我們就拿string舉個例子。
1. string 中的數字求 sum在很久以前你可能會這么做。
static void Main(string[] args) { var s = "97 3"; var arr = s.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries); var sum = Convert.ToInt32(arr[0]) + Convert.ToInt32(arr[1]); Console.WriteLine(sum); }
圖片
從代碼可以看出,對 string 進行Split會導致生成多個小string對象,那有沒有辦法不用生成小string呢?這就需要用到托管版的Span做原地處理了。
static void Main(string[] args) { var s = "97 3"; var position = s.IndexOf(" "); ReadOnlySpan span = s.AsSpan(); var num1 = int.Parse(span.Slice(0, position)); var num2 = int.Parse(span.Slice(position)); Console.WriteLine(num1 + num2); }
圖片
Span的這種做法就是通過_pointer指針在內存地址上進行移動來完成,如果看不明白,我可以用C來模擬一下。
#include struct Span { int length; void* ptr;};void sum(Span* span);int main(){ Span span; span.ptr = (char*)"97 3"; span.length = strlen((char*)span.ptr); sum(&span);}void sum(Span* span) { int sum = 0; char* position = strchr((char*)span->ptr, " "); Span span1; span1.ptr = span->ptr; span1.length = (position - span->ptr) / sizeof(char); Span span2; span2.ptr = position; span2.length = span->length - span1.length - 1; int num1= atoi((char*)span1.ptr); int num2= atoi((char*)span2.ptr); sum = num1 + num2; printf("sum=%d", sum);}
圖片
雖然代碼有點多,但邏輯還是很清楚的。
如果大家明白Span所封裝的底層指針玩法,我想這其實沒什么難的,本篇就說到這里吧,希望對你有幫助。
關鍵詞:
把Span歸于語法糖,可能有些偏了,但偏了就偏了,哈哈,只要是分享就好
MongoDB是一種可伸縮的數據庫,支持數據分片和負載均衡,以實現高性能
世界最強AI——ChatGPT可以通過各種考試,甚至輸出回答讓人難以辨別真
開學季|“芝士”就是力量,5分鐘上學不遲到的早餐,真的漲知識了
轉眼間,九月來了瓜果漸熟,稻谷飄香,蟹肥菊黃……新的一個月,繼續努
中國天氣網訊中央氣象臺9月1日06時繼續發布暴雨黃色預警:預計,9月1日
大家都知道,華為售后提供存儲空間升級服務,比如你的手機是128G存儲,
今天來聊聊關于progression和progress的區別,progression的文章,現在
獲取方式:參考如下文章Step13步驟可獲取該物品:地點攻略-湖之利耶尼
1、bepleasedwithsth :對某事某物喜歡,滿意于…bepleasedto(do):樂意,蒙
今日3個行業逆市上漲。證券時報·數據寶統計,今日滬深兩市主力資金凈
第一時間提供各大券商研究所報告,最大程度減少個人投資者與機構之間信
在軟件開發的世界里,故障難免。無論是初學者還是經驗豐富的開發人員,
在現代應用程序開發中,處理大量異步數據流變得越來越常見。傳統的編程
數據倉庫是企業中存儲和管理大量結構化數據的核心組件,用于支持業務分