精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C# 中的 ref 已經被放開,或許你已經不認識了

開發 前端
不知道大家有沒有發現,在 C# 7.0 之后,語言團隊對性能這一塊真的是前所未有的重視,還專門為此出了各種類和底層支持,比如說 Span, Memory,ValueTask,還有本篇要介紹的ref。

一:背景

1. 講故事

最近在翻 netcore 源碼看,發現框架中有不少的代碼都被 ref 給修飾了,我去,這還是我認識的 ref 嗎?就拿 Span 來說,代碼如下:

public readonly ref struct Span<T>
    {
        public ref T GetPinnableReference()
        {
            ref T result = ref Unsafe.AsRef<T>(null);
            if (_length != 0)
            {
                result = ref _pointer.Value;
            }
            return ref result;
        }

        public ref T this[int index]
        {
            get
            {
                return ref Unsafe.Add(ref _pointer.Value, index);
            }
        }             
    }

是不是到處都有 ref,在 struct 上有,在 local variable 也有,在 方法簽名處 也有,在 方法調用處 也有,在 屬性 上也有, 在 return處 也有,簡直是應有盡有,太????啦,那這一篇我們就來聊聊這個奇葩的 ref。

二:ref 各場景下的代碼解析

1. 動機

不知道大家有沒有發現,在 C# 7.0 之后,語言團隊對性能這一塊真的是前所未有的重視,還專門為此出了各種類和底層支持,比如說 Span, Memory,ValueTask,還有本篇要介紹的ref。

在大家傳統的認知中 ref 是用在方法參數上,用于給 值類型 做引用傳值,一個是為了大家業務上需要多次原地修改的情況,二個是為了避免值類型的copy引發的性能開銷,不知道是哪一位大神腦洞大開,將 ref 應用在你所知道的代碼各處,最終目的都是盡可能的提升性能。

2. ref struct 分析

從小就被教育 值類型分配在棧上,引用類型是在堆上,這話也是有問題的,因為值類型也可以分配在堆上,比如下面代碼的 Location。

public class Program
    {
        public static void Main(string[] args)
        {
            var person = new Person() { Name = "張三", Location = new Point() { X = 10, Y = 20 } };

            Console.ReadLine();
        }
    }

    public class Person
    {
        public string Name { get; set; }

        public Point Location { get; set; }  //分配在堆上
    }

    public struct Point
    {
        public int X { get; set; }
        public int Y { get; set; }
    }

其實這也是很多新手朋友學習值類型疑惑的地方,可以用 windbg 到托管堆找一下 Person 問問看,如下代碼:

0:000> !dumpheap -type Person
         Address               MT     Size
0000010e368aadb8 00007ffaf50c2340       32     

0:000> !do 0000010e368aadb8
Name:        ConsoleApp2.Person
MethodTable: 00007ffaf50c2340
EEClass:     00007ffaf50bc5e8
Size:        32(0x20) bytes
File:        E:\net5\ConsoleApp1\ConsoleApp2\bin\Debug\netcoreapp3.1\ConsoleApp2.dll
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
00007ffaf5081e18  4000001        8        System.String  0 instance 0000010e368aad98 <Name>k__BackingField
00007ffaf50c22b0  4000002       10    ConsoleApp2.Point  1 instance 0000010e368aadc8 <Location>k__BackingField

0:000> dp 0000010e368aadc8
0000010e`368aadc8  00000014`0000000a 00000000`00000000

上面代碼最后一行 00000014`0000000a 中的 14 和 a 就是 y 和 x 的值,穩穩當當的存放在堆中,如果你還不信就看看 gc 0代堆的范圍。

0:000> !eeheap -gc
Number of GC Heaps: 1
generation 0 starts at 0x0000010E368A1030
generation 1 starts at 0x0000010E368A1018
generation 2 starts at 0x0000010E368A1000
ephemeral segment allocation context: none
         segment             begin         allocated              size
0000010E368A0000  0000010E368A1000  0000010E368B55F8  0x145f8(83448)

從最后一行可看出,剛才的  0000010e368aadc8 確實是在 0 代堆 0x0000010E368A1030 - 0000010E368B55F8 的范圍內。

接下來的問題就是能不能給 struct 做一個限制,就像泛型約束一樣,不準 struct 分配在堆上,有沒有辦法呢?辦法就是加一個 ref 限定即可,如下圖:

圖片圖片

從錯誤提示中可以看出,有意讓 struct 分配到堆上的操作都是嚴格禁止的,要想過編譯器只能將 class person 改成 ref struct person,也就是文章開頭 Span  和  this[int index] 這樣,動機可想而知,一切都是為了性能。

3. ref method 分析

給方法的參數傳引用地址,我想很多朋友都已經輕車熟路了,比如下面這樣:

public static int GetNum(ref int i)
        {
            return i;
        }

現在大家可以試著跳出思維定勢,既然可以往方法內仍 引用地址 ,那能不能往方法外拋 引用地址 呢?如果這也能實現就比較有意思了,我可以對集合內的某一些數據進行引用地址返回,在方法外照樣可以修改這些返回值,畢竟傳來傳去都是引用地址,如下代碼所示:

public class Program
    {
        public static void Main(string[] args)
        {
            var nums = new int[3] { 10, 20, 30 };

            ref int num = ref GetNum(nums);

            num = 50;

            Console.WriteLine($"nums= {string.Join(",",nums)}");

            Console.ReadLine();
        }

        public static ref int GetNum(int[] nums)
        {
            return ref nums[2];
        }
    }

圖片圖片

可以看到,數組的最后一個值已經由 30 -> 50 了,有些朋友可能會比較驚訝,這到底是怎么玩的,不用想就是引用地址到處漂,不信的話,看看 IL 代碼咯。

.method public hidebysig static 
 int32& GetNums (
  int32[] nums
 ) cil managed 
{
 // Method begins at RVA 0x209c
 // Code size 13 (0xd)
 .maxstack 2
 .locals init (
  [0] int32&
 )

 // {
 IL_0000: nop
 // return ref nums[2];
 IL_0001: ldarg.0
 IL_0002: ldc.i4.2
 IL_0003: ldelema [System.Runtime]System.Int32
 IL_0008: stloc.0
 // (no C# code)
 IL_0009: br.s IL_000b

 IL_000b: ldloc.0
 IL_000c: ret
} // end of method Program::GetNums

.method public hidebysig static 
 void Main (
  string[] args
 ) cil managed 
{
 IL_0013: ldloc.0
 IL_0014: call int32& ConsoleApp2.Program::GetNums(int32[])
 IL_0019: stloc.1
 IL_001a: ldloc.1
 IL_001b: ldc.i4.s 50
 IL_003e: pop
 IL_003f: ret
} // end of method Program::Main

可以看到,到處都是 & 取值運算符,更直觀一點的話用 windbg 看一下。

0:000> !clrstack -a
OS Thread Id: 0x7040 (0)
000000D4E777E760 00007FFAF1C5108F ConsoleApp2.Program.Main(System.String[]) [E:\net5\ConsoleApp1\ConsoleApp2\Program.cs @ 28]
    PARAMETERS:
        args (0x000000D4E777E7F0) = 0x00000218c9ae9e60
    LOCALS:
        0x000000D4E777E7C8 = 0x00000218c9aeadd8
        0x000000D4E777E7C0 = 0x00000218c9aeadf0

0:000> dp 0x00000218c9aeadf0
00000218`c9aeadf0  00000000`00000032 00000000`00000000

上面代碼處的 0x00000218c9aeadf0 就是 num 的引用地址,繼續用 dp 看一下這個地址上的值為 16進制的32,也就是十進制的 50 哈。

三:總結

總的來說,netcore 就是在當初盛行的 云計算 和 虛擬化 時代誕生,基因和使命促使它必須要優化優化再優化,再小的螞蟻也是肉,最后就是 C# 大法 ????

責任編輯:武曉燕 來源: 一線碼農聊技術
相關推薦

2024-02-01 08:29:42

大數據計算業務

2014-11-19 15:08:09

CSS

2021-05-10 08:34:37

USB接口USB網絡設備

2019-04-09 10:45:18

IPv6運營商協議

2024-06-17 08:16:22

2020-01-07 11:04:02

JavaJSP前端

2013-11-29 10:23:29

OS X 10.9問題蘋果

2009-12-21 09:28:21

AMD CEO英特爾CEO

2017-07-28 09:39:12

隱式IntentAndroid M

2014-03-11 10:03:25

設計模式

2009-04-17 15:19:25

職場過時晚年

2018-08-03 16:41:23

數據房子存量

2023-03-31 07:49:52

NVIDIAGPU芯片

2013-07-11 16:10:39

蘋果時代

2024-10-10 12:05:03

2011-02-25 17:00:25

SQL閏年

2025-06-11 03:15:00

2022-09-15 14:04:07

Go語言泛型

2015-08-11 09:51:06

谷歌重組Alphabet
點贊
收藏

51CTO技術棧公眾號

国产精品自产拍在线观看中文| 日韩一区二区三区在线观看| 日韩欧美99| 91亚洲欧美激情| 天天射综合网视频| 日韩欧美区一区二| wwwxxx黄色片| 麻豆传媒在线免费看| 国产精品资源网| 5278欧美一区二区三区| av在线免费播放网址| 高清一区二区三区| 色综合天天综合在线视频| 中文字幕在线中文字幕日亚韩一区 | 粗暴蹂躏中文一区二区三区| 男女一区二区三区| 黄色成人小视频| 五月天视频一区| 在线不卡视频一区二区| 日本午夜在线视频| 粉嫩av亚洲一区二区图片| 国产精品com| 国产成人在线播放视频| 亚洲欧美网站在线观看| 亚洲欧美日韩天堂| 岛国av免费观看| 日韩亚洲国产免费| 色综合天天性综合| 久久国产精品视频在线观看| 岛国成人毛片| 国产精品久久久久久久久久免费看| 国产一区高清视频| www.桃色av嫩草.com| 久久99热这里只有精品| 国产精品成熟老女人| 国产精品久久久久久99| 尤物精品在线| 欧美激情精品久久久久久黑人| 一区二区三区在线播放视频| 国产尤物久久久| 亚洲精品美女久久| 中文字幕免费高清视频| 在线综合色站| 欧美成人官网二区| 原创真实夫妻啪啪av| 午夜精品久久久久久毛片| 在线精品国精品国产尤物884a| 日韩免费一级视频| sm久久捆绑调教精品一区| 亚洲图片一区二区| 久草视频这里只有精品| 欧美家庭影院| 亚洲国产日韩在线一区模特| 日韩成人三级视频| 三级资源在线| 亚洲国产精品久久人人爱蜜臀| 国产精品国产三级国产专区51| 操你啦在线视频| 一区二区高清视频在线观看| 伊人再见免费在线观看高清版 | 91小视频在线播放| 国产精品久久免费视频| 欧美一区二区三区视频免费 | 日韩亚洲欧美成人| 91无套直看片红桃在线观看| 日韩av自拍| 日韩中文av在线| 精品女人久久久| 亚洲国产精品综合久久久 | 卡通动漫亚洲综合| 亚洲男女av一区二区| 欧美激情视频在线观看| 国产午夜福利精品| 久久久久久黄| 欧美私模裸体表演在线观看| 国模吧无码一区二区三区| 亚洲电影观看| 精品1区2区3区| 手机av在线网站| 加勒比久久高清| 亚洲人成亚洲人成在线观看| 貂蝉被到爽流白浆在线观看| 欧美一区二区三区久久精品| 午夜精品理论片| 精品国产乱子伦| 狠狠狠色丁香婷婷综合久久五月| 国产 高清 精品 在线 a| 偷拍自拍在线| 国产精品理伦片| 成年女人18级毛片毛片免费| 偷拍精品精品一区二区三区| 91精品国产综合久久久久久漫画 | 在线观看亚洲国产| 懂色av中文字幕一区二区三区| 蜜桃传媒视频麻豆一区| 久久黄色美女电影| 精品毛片三在线观看| 一区二区三区免费播放| 一区二区三区四区高清视频| 亚洲欧美国产日韩天堂区| 久久人妻无码aⅴ毛片a片app| 亚洲激情成人| 91精品久久久久久久久青青| 日批视频在线播放| 中文字幕欧美一| 国产成人在线免费看| 中文字幕日本一区| 精品无人国产偷自产在线| 性欧美疯狂猛交69hd| 久久高清国产| 99在线视频首页| 91精彩视频在线观看| 五月开心婷婷久久| 欧美国产在线一区| 欧洲美女日日| 欧美一级免费视频| 午夜精品无码一区二区三区| 国产精品美女视频| 亚洲熟妇av一区二区三区| 亚洲三区欧美一区国产二区| 深夜福利亚洲导航| 麻豆精品久久久久久久99蜜桃| 国产69精品久久777的优势| 视频一区不卡| 日韩电影网站| 日韩成人av网| 久久精品国产亚洲AV无码麻豆| 精品一区二区三区久久| 日韩电影在线播放| 草美女在线观看| 日韩欧美中文字幕一区| 国产精品精品软件男同| 喷白浆一区二区| 裸体丰满少妇做受久久99精品| 丁香影院在线| 日韩精品一区二区三区视频播放 | 精精国产xxxx视频在线中文版| 91.com视频| 国产人与禽zoz0性伦| 奇米影视7777精品一区二区| 日韩欧美在线一区二区| 欧美特黄aaaaaaaa大片| 亚洲午夜未满十八勿入免费观看全集| 亚洲精品77777| av影院午夜一区| 免费av手机在线观看| av男人一区| 久久免费观看视频| 色香蕉在线视频| 五月激情六月综合| 美女又爽又黄视频毛茸茸| 亚洲久色影视| 免费看污久久久| 伊人成综合网站| 亚洲精品在线不卡| 日韩精品成人免费观看视频| 国产偷国产偷亚洲高清人白洁| 欧美日韩亚洲一二三| 精品美女视频| 国产精品无码专区在线观看| 麻豆电影在线播放| 日韩一级黄色大片| 久久久久久久久久99| 成人在线一区二区三区| 波多野结衣综合网| 亚洲图片久久| 国产精品永久在线| av软件在线观看| 亚洲福利精品在线| 加勒比在线一区| 亚洲四区在线观看| 中文字幕无人区二| 国产一级久久| 性欧美大战久久久久久久免费观看 | 先锋资源久久| 国产精品 日韩| 成人免费无遮挡| 神马国产精品影院av| jizz国产视频| 欧美日韩亚洲高清| 亚洲黄色网址大全| 国产91精品露脸国语对白| 国产1区2区在线| 欧美一区二区| 欧美一区二区三区在线播放| 99精品视频在线免费播放| 久久男人的天堂| gogogo高清在线观看免费完整版| 欧美一区二区三区爱爱| 国产成人在线观看网站| 国产精品久久福利| 国产精品久久久久久久无码| 久久国产精品第一页| 亚洲 欧美 综合 另类 中字| jvid福利在线一区二区| 国产精品久久久久av福利动漫| 亚洲伦乱视频| 欧美激情中文字幕在线| 91网在线播放| 国产网站欧美日韩免费精品在线观看| 国产精品久久久久久69| 婷婷综合五月天| 老司机成人免费视频| 久久综合成人精品亚洲另类欧美 | 亚洲少妇屁股交4| 国产亚洲无码精品| 国产99久久久国产精品免费看| 91蝌蚪视频在线观看| 黄色一区二区三区四区| 亚洲国产成人不卡| 全球av集中精品导航福利| 亚洲一区中文字幕在线观看| 欧美成人精品三级网站| 久久久久免费视频| 久热国产在线| 最近2019中文字幕第三页视频| 无码精品一区二区三区在线| 欧美一二三四在线| 亚洲图片在线播放| 91久久国产最好的精华液| jizz国产免费| 一区二区三区四区不卡视频| 国产又粗又长又黄的视频| 久久综合精品国产一区二区三区| 国产激情第一页| 国产1区2区3区精品美女| 国产探花在线观看视频| 蜜臀久久99精品久久久久久9| 国产乱子夫妻xx黑人xyx真爽 | 性欧美长视频免费观看不卡| 99久久精品免费观看国产| 在线成人中文字幕| 欧洲免费在线视频| 日韩精品一二三四区| 蜜臀久久99精品久久久| 欧美xxxx在线观看| www.黄色国产| 日韩欧美在线综合网| 国产免费一区二区三区最新不卡| 欧美午夜一区二区| 国模私拍一区二区| 在线观看一区日韩| 看黄色一级大片| 91福利精品视频| 少妇无套内谢久久久久| 欧美无砖专区一中文字| 中文字幕久久久久| 欧美日韩国产高清一区二区| 在线观看日韩一区二区| 欧美另类高清zo欧美| 中文字幕在线播出| 欧美精品久久99久久在免费线| 中文无码精品一区二区三区| 欧美日韩一级视频| 国产精品毛片一区二区在线看舒淇 | 久久综合九色九九| 在线观看男女av免费网址| 欧美日韩999| av中文在线资源库| 日本精品久久久| 欧美日韩五码| 国产在线精品播放| 欧美成人一级| 官网99热精品| 在线日本制服中文欧美| 四虎一区二区| 中文视频一区| 亚洲熟妇无码一区二区三区导航| 亚洲欧美视频| 日韩不卡一二三| 国产一区三区三区| 男人网站在线观看| 久久久99精品免费观看| 国产中文字幕久久| 亚洲尤物在线视频观看| 天天干天天干天天干天天| 欧美中文字幕一二三区视频| 国产一区二区波多野结衣| 日韩欧美国产午夜精品| 日韩电影在线观看完整版| 日韩在线视频免费观看| 免费在线国产视频| 国产国语videosex另类| 国产欧美视频在线| 久久另类ts人妖一区二区| 热久久天天拍国产| 无码人妻少妇伦在线电影| 久久最新视频| 波多野结衣中文字幕在线播放| av一二三不卡影片| 亚洲 欧美 国产 另类| 五月婷婷久久综合| 一二三四区视频| 亚洲精品久久7777777| 欧美成年黄网站色视频| 69视频在线播放| 亚洲日本中文| 免费一区二区三区在在线视频| 亚洲国产精品91| 妞干网在线免费视频| 国产成人在线视频网站| 极品蜜桃臀肥臀-x88av| 亚洲国产视频在线| 亚洲综合视频在线播放| 亚洲精品视频在线播放 | 亚洲欧美另类在线| 91久久国产综合久久91| 精品精品国产高清一毛片一天堂| 2017亚洲天堂1024| 91精品国产电影| 日韩影片在线观看| 亚洲午夜在线观看| 国产日韩欧美三区| 国产精品91av| 中文字幕日韩精品一区| 波多野结衣绝顶大高潮| 亚洲精品mp4| 欧美xxxxhdvideosex| 国产日韩中文字幕| 神马电影久久| 亚欧无线一线二线三线区别| 成人一级视频在线观看| 中文字幕另类日韩欧美亚洲嫩草| 欧美视频中文字幕| 欧美中文在线| 91精品国产777在线观看| 成人h动漫免费观看网站| 992tv成人免费观看| 久久成人麻豆午夜电影| 娇妻被老王脔到高潮失禁视频| 黄色成人在线播放| 免费看日韩av| 韩国精品久久久999| 成人激情自拍| 日韩精品在线观看av| 国产乱码精品一区二区三| 男人的午夜天堂| 欧美日本高清视频在线观看| www.亚洲视频| 国产一区玩具在线观看| 日韩在线视频精品| www.久久av.com| 国产精品美女久久久久久久网站| 依依成人在线视频| 色阁综合伊人av| 欧洲美女精品免费观看视频| 中文字幕99| 国产制服丝袜一区| 亚洲国产成人精品综合99| 欧美一区二区三区人| 午夜dj在线观看高清视频完整版| 亚洲a中文字幕| 国产精品激情| 国产中文字幕一区二区| 色婷婷激情综合| av在线日韩国产精品| 国产综合视频在线观看| 一区二区三区网站| 岛国精品一区二区三区| 午夜a成v人精品| 国产在线色视频| 成人做爽爽免费视频| 国产精品99一区二区| 日韩精品一区二区三区高清免费| 懂色av一区二区三区| 成人网视频在线观看| 成人在线视频网| 亚洲成色精品| www在线观看免费视频| 欧美日韩电影在线| 亚洲综合伊人久久大杳蕉| 精品国产一区二区三区免费 | 不卡在线一区| 亚欧美一区二区三区| 婷婷久久综合九色综合绿巨人 | 97国产精东麻豆人妻电影| 久久久久亚洲蜜桃| 97人妻精品一区二区三区| 久久99久久99精品中文字幕| 蜜桃一区av| 性生交免费视频| 一二三四区精品视频| 三级无遮挡在线观看| 国产欧美日韩综合精品| 伊人久久大香线蕉av超碰演员| 久久亚洲AV无码专区成人国产| 91麻豆精品国产91久久久资源速度 | 亚洲黄色小说网| 日韩av色在线| 你懂的网址国产 欧美| 无遮挡aaaaa大片免费看| 欧美精品久久一区| 欧美裸体视频| 久久久久久久免费视频| 久久这里只有精品视频网| 国产乱码一区二区| 日本视频久久久| 激情视频一区二区三区| 中国美女黄色一级片| 日韩精品在线视频观看|