C# System.Span<T>、ref struct

1. Span<T>的特性

  • system.span<T>在.net core 2.0版本引入
  • 它適用于對連續內存的操作,而不產生新的內存分配,比如數組、字符串、堆外內存
  • 類型為ref struct,不能作為參數傳遞,不能被裝箱(不能作為類的字段),不能作為async的返回值,只能是現用現聲明,用來對原始數組操作
  • 可以通過stackalloc在棧上分配內存,不涉及堆分配和垃圾回收
  • 因為不涉及堆內存分配,所以性能比較高
1.1 Span<T>?的一些典型用法示例:
  • 對已有的數組進行切片操作,無需創建新數組:
int[] numbers = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };// 獲取一個數組切片slice,現在指向 numbers 的子區域,包含元素 2, 3, 4, 5, 6
Span<int> slice = numbers.AsSpan().Slice(start: 2, length: 5); 
  • 在不需要副本的情況下操作字符串:
string str = "Hello, World!"; 
//獲取字符串的一個切片,span 現在指向字符串 "World"
//注意:這里使用 ReadOnlySpan<char> 因為字符串是不可變的
ReadOnlySpan<char> span = str.AsSpan().Slice(start: 7, length: 5); 
  • 處理從文件或網絡讀取的數據緩沖區:
  • //假設這是從文件或網絡讀取的數據 
    byte[] buffer = new byte[1024];//現在可以使用 bufferSpan 進行讀取和寫入操作,而不需要復制數據
    Span<byte> bufferSpan = buffer.AsSpan(); 
  • 棧分配數組(通過 stackalloc)
//在棧上分配內存,不涉及堆分配或垃圾回收 
Span<int> stackAllocatedArray = stackalloc int[10]; 
for (int i = 0; i < stackAllocatedArray.Length; i++)
{ stackAllocatedArray[i] = I;
}
  • 圖像處理和音頻緩沖操作等領域,需要高性能內存操作:
  • //假設有一個表示圖像像素的 byte 數組 
    byte[] imagePixels = new byte[width * height * bytesPerPixel]; 
    Span<byte> imageSpan = imagePixels.AsSpan(); // 對圖像進行處理,例如反轉顏色 
    for (int i = 0; i < imageSpan.Length; i += bytesPerPixel)
    { imageSpan[i] = (byte)(255 - imageSpan[i]); // R imageSpan[i + 1] = (byte)(255 - imageSpan[i + 1]); // G imageSpan[i + 2] = (byte)(255 - imageSpan[i + 2]); // B // 如果是 RGBA 格式,還需要處理 Alpha 通道
    }

    Span<T>的這些用法展示了它如何提供對內存的高效訪問,同時保持類型安全。由于 Span<T>是 `ref struct`,它具有一些限制,例如不能被裝箱、不能作為異步方法的返回值,也不能存儲在堆上,這些限制有助于保持其性能優勢。

2. ref struct的特性

  • 特殊的值類型
  • 不能被裝箱,不能作為類的字段,不能作為異步方法的返回值
  • 不涉及堆內存分配,性能比較高
2.1 ref struct 與 值類型的區別
  • 值類型可以被裝箱,可以作為類的字段
  • ref struct 不能被裝箱,不可以作為類的字段

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15594.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15594.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15594.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

信號處理技術:現代通信技術的基石

隨著信息技術的飛速發展&#xff0c;通信技術的每一次革新都極大地改變了人們的生活方式。而在這背后&#xff0c;信號處理技術作為通信技術的核心&#xff0c;通過深入分析信號特性、提取有用信息、轉換信號形式等一系列手段&#xff0c;為現代通信技術的發展提供了強有力的支…

機器學習7大方面,30個硬核數據集。純干貨分享

在剛剛開始學習算法的時候&#xff0c;大家有沒有過這種感覺&#xff0c;最最重要的那必須是算法本身&#xff01; 其實在一定程度上忽略了數據的重要性。 而事實上一定是&#xff0c;質量高的數據集可能是最重要的&#xff01; 數據集在機器學習算法項目中具有非常關鍵的重…

Python讀寫文件

最近得以空閑&#xff0c;然后繼續學習py。 學習一下py中最頻繁用到的文件讀寫的方法。 在py中&#xff0c;操作是通過文件對象【File obj】實現的&#xff0c;通過文件對象可以讀寫文本文件和一些二進制文件。 1.打開文件 使用Python中的open函數。有8個參數&#xff0c;但…

2024.5.25.python.exercise

# # 導入數據處理的包 # # from pyecharts.charts import Line # # from pyecharts.options import TitleOpts, LegendOpts, ToolboxOpts, VisualMapOpts, LabelOpts # # import json # # # # # 打開文件 # # file_us open("美國.txt", "r", encoding&quo…

C++ Primer Plus第十八章復習題

1、使用用大括號括起的初始化列表語法重寫下述代碼。重寫后的代碼不應使用數組ar。 class z200 { private:int j;char ch;double z; public:Z200(int jv,char chv&#xff0c;zv) : j(jv), ch (chv), z(zv){} };double x 8.8; std::string s "what a bracing effect ! …

頭歌OpenGauss數據庫-H.存儲過程第1關:創建存儲過程

編程要求 數據庫中已經存在三個基礎表&#xff1a; student ( num integer, name char(20), age integer, level integer, dept char(20) ); course ( id integer, name char(20) ); sel_course ( studentid integer, courseid integer, score integer ); 創建存儲過程&#xf…

Vue3/Vite引入EasyPlayer.js播放H265視頻錯誤的問題

一、引入EasyPlayer.js github鏈接:GitHub - EasyDarwin/EasyPlayer.js: EasyPlayer.js H5播放器 將demo/html目錄下的 EasyPlayer-element.min.js、EasyPlayer-lib.min.js、EasyPlayer.wasm、jquery.min.js 復制到vue3工程的public目錄下,注意,vue3 vite的index.html文件…

win10配置wsl的深度學習環境

# 1、一步完成wsl&#xff1a;開啟虛擬機、linux子系統、并下載ubuntu # 官方文檔: https://learn.microsoft.com/zh-cn/windows/wsl/install wsl --install# 2、打開windows terminal&#xff0c;選ubuntu交互環境 # 第一次需要配置用戶名和密碼 # 接下來正常使用即可# 3、cud…

自然資源-做好用地用海國土空間規劃符合性審查

自然資源-做好用地用海國土空間規劃符合性審查 為發揮國土空間規劃戰略引領和剛性管控作用&#xff0c;強化國土空間規劃對各專項規劃的指導約束作用&#xff0c;依法依規加強自然資源要素保障&#xff0c;做好用地用海用島國土空間規劃符合性審查工作&#xff1a; 一、加快地…

深入了解數據庫設計中的規范化與反規范化

目錄 零、前言 一、一些基本術語 二、關系模式 2.1. 什么是關系模式 2.2. 示例 三、數據依賴 3.1. 函數依賴 3.1.1. 完全函數依賴 3.1.2. 部分函數依賴 3.1.3. 傳遞函數依賴 3.2. 多值依賴 3.3. 連接依賴 四、規范化 4.1. 第一范式&#xff08;1NF&#xff09; …

什么是 DNS 轉發?

DNS轉發是一種網絡傳輸技術&#xff0c;主要用于解決本地DNS服務器無法直接解析某個特定域名的情況。當本地DNS服務器收到一個無法解析的域名請求時&#xff0c;它會將該請求轉發給其他可信的DNS服務器&#xff0c;以獲取所需的解析結果。這種技術有助于優化網絡性能和安全性&a…

【Flutter】有狀態組件StatefulWidgetScaffold組件屬性

&#x1f525; 本文由 程序喵正在路上 原創&#xff0c;CSDN首發&#xff01; &#x1f496; 系列專欄&#xff1a;Flutter學習 &#x1f320; 首發時間&#xff1a;2024年5月26日 &#x1f98b; 歡迎關注&#x1f5b1;點贊&#x1f44d;收藏&#x1f31f;留言&#x1f43e; 目…

AWS聯網和內容分發之VPC

Amazon Virtual Private Cloud&#xff08;VPC&#xff09;是一項用于在AWS云中創建一個邏輯隔離的虛擬網絡的服務&#xff0c;使用戶能夠在云中啟動AWS資源&#xff08;例如EC2實例&#xff09;&#xff0c;并將其放置在自己定義的虛擬網絡中。 Amazon VPC讓您能夠全面地控制…

AEE運行機制深入剖析——閱讀筆記

AEE運行機制深入剖析——閱讀筆記 在移動設備和嵌入式系統的開發中&#xff0c;應用執行環境&#xff08;Application Execution Environment&#xff0c;簡稱AEE&#xff09;起著至關重要的作用。AEE是操作系統層面的一個框架&#xff0c;負責管理應用程序的生命周期&#xf…

JVM性能調優:內存模型及垃圾收集算法

JVM內存結構 根據Java虛擬機規范&#xff0c;JVM內存主要劃分為以下區域&#xff1a; 年輕代&#xff08;New Generation&#xff09; 包括Eden空間&#xff0c;用于存放新創建的對象。Survivor區由兩個相同大小的Survivor1和Survivor2組成&#xff0c;用于存放經過初次垃圾回…

AI菜鳥向前飛 — LangChain系列之十四 - Agent系列:從現象看機制(上篇)

上一篇介紹了Agent與LangGraph的基礎技能Tool的必知必會 AI菜鳥向前飛 — LangChain系列之十三 - 關于Tool的必知必會 前面已經詳細介紹了Promp、RAG&#xff0c;終于來到Agent系列&#xff08;別急后面還有LangGraph&#xff09;&#xff0c;大家可以先看下這張圖&#xff1…

leetcode328. 奇偶鏈表,附詳細解析和代碼注釋

leetcode328. 奇偶鏈表 給定單鏈表的頭節點 head &#xff0c;將所有索引為奇數的節點和索引為偶數的節點分別組合在一起&#xff0c;然后返回重新排序的列表。 第一個節點的索引被認為是 奇數 &#xff0c; 第二個節點的索引為 偶數 &#xff0c;以此類推。 請注意&#xff0…

Java的反射機制詳解:動態操作類和對象

Java反射是一種強大的機制&#xff0c;允許程序在運行時查詢和操作類、方法、接口等。這種能力使得Java應用可以在運行時動態地創建對象、調用方法和訪問屬性&#xff0c;極大地提升了程序的靈活性和可擴展性。本文將深入探討Java反射的原理、核心API和實際應用場景&#xff0c…

Flutter 中的 CupertinoSlidingSegmentedControl 小部件:全面指南

Flutter 中的 CupertinoSlidingSegmentedControl 小部件&#xff1a;全面指南 在Flutter框架中&#xff0c;CupertinoSlidingSegmentedControl是一個用于創建類似iOS風格的滑動分段控制器的小部件。這種控制器通常用于允許用戶在不同的視圖或設置之間切換。本文將為您提供一個…

輕量級 K8S 環境 安裝minikube

文章目錄 操作系統DockerDocker CE 鏡像源站使用官方安裝腳本自動安裝 &#xff08;僅適用于公網環境&#xff09;安裝校驗Docker代理docker permission denied while trying to connect to the Docker daemon socket minikubekubectl工具minikube dashboard參考資料 操作系統 …