日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

这个拖后腿的“in”

發(fā)布時(shí)間:2023/12/4 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 这个拖后腿的“in” 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

問(wèn)題之源

C# 7.2推出了全新的參數(shù)修飾符in,據(jù)說(shuō)是能提升一定的性能,官方MSDN文檔描述是:

Add the?in?modifier to pass an argument by reference and declare your design intent to pass arguments by reference to avoid unnecessary copying.?

然而,想當(dāng)然地使用它卻導(dǎo)致更多的副本出現(xiàn),影響代碼運(yùn)行速度。

MSDN中還有一段隱含的副作用的描述:

You can call any instance method that uses by value parameters. In those instances, a copy of the?in?parameter is created.?

同時(shí)文檔也提到了readonly ref的目的:

After adding support for?in?parameters and?ref redonly?[sic] returns the problem of defensive copying will get worse since readonly variables will become more common.

?來(lái)看一下MSDN里的這個(gè)例子::

private static double CalculateDistance(in Point3D point1, in Point3D point2)

{

? ? double xDifference = point1.X - point2.X;

? ? double yDifference = point1.Y - point2.Y;

? ? double zDifference = point1.Z - point2.Z;


? ? return Math.Sqrt(xDifference * xDifference + yDifference * yDifference + zDifference * zDifference);

}

假設(shè)Point3D類型是這樣定義的:

public struct Point3D

{

? ? public Point3D(double x, double y, double z)

? ? {

? ? ? ? X = x;

? ? ? ? Y = y;

? ? ? ? Z = z;

? ? }


? ? public double X { get; }

? ? public double Y { get; }

? ? public double Z { get; }

}

結(jié)果C#的幾個(gè)本不相關(guān)的特性以一種鬧心的方式結(jié)合起來(lái):

  • 標(biāo)記了in的結(jié)構(gòu)體參數(shù)是readonly只讀的

  • 調(diào)用標(biāo)記為readonly的結(jié)構(gòu)體的實(shí)例化方法將產(chǎn)生一個(gè)副本

    • 因?yàn)檫@個(gè)方法要通過(guò)改變this指針來(lái)達(dá)到確保標(biāo)記了readonly的原值不會(huì)被修改

    • 屬性訪問(wèn)器也是實(shí)例方法,受this影響

    • 每次給CalculateDistance方法傳遞標(biāo)記了in的結(jié)構(gòu)體參數(shù)時(shí),編譯器會(huì)在訪問(wèn)時(shí)自動(dòng)為這個(gè)參數(shù)的每個(gè)屬性創(chuàng)建一個(gè)副本,本以為不會(huì)創(chuàng)建副本,結(jié)果反而每個(gè)傳進(jìn)來(lái)的參數(shù)在方法內(nèi)部弄出來(lái)3個(gè)!

      這個(gè)問(wèn)題存在已久,看一下Jon Skeet的博客:The Surprising Inefficiency of Readonly Fields。只不過(guò)使用in讓這個(gè)尷尬的場(chǎng)面更頻繁易現(xiàn)了。

      解決方案

      解決辦法同樣來(lái)自C# 7.2:readonly struct.

      如果將public struct Point3D改成public readonly struct Point3D,因?yàn)樗凶侄我惨呀?jīng)是readonly了,所以整個(gè)結(jié)構(gòu)體都無(wú)需改變,編譯器此時(shí)也會(huì)省掉副本的操作,只有這樣才會(huì)出現(xiàn)結(jié)構(gòu)體參數(shù)比按值傳遞獲得更快的運(yùn)行速度。

      不過(guò)注意在C# 7.1中結(jié)構(gòu)體是可以通過(guò)標(biāo)記ref來(lái)傳參達(dá)到同樣避免副本開銷的。盡管如此,結(jié)構(gòu)體參數(shù)的字段想要改變值仍是可變的,甚至這個(gè)結(jié)構(gòu)體都可以指向另一個(gè)新的。在函數(shù)的參數(shù)列表中使用in的聲明主要意圖還是為了告訴調(diào)用者本函數(shù)不會(huì)去修改傳進(jìn)來(lái)的參數(shù),當(dāng)然編譯器也會(huì)配合強(qiáng)制保證。

      示例

      這里有一個(gè)關(guān)于in,?ref,?structreadonly struct各種組合的性能測(cè)評(píng)(結(jié)構(gòu)體size太小看不出差別,因此這個(gè)示例把結(jié)構(gòu)體增加到56 bytes以便跑出更明顯的對(duì)比效果)。結(jié)果如下:

      總結(jié)

      • 當(dāng)使用in代替ref表示設(shè)計(jì)意圖時(shí),要明白在傳遞較大且較多的結(jié)構(gòu)體時(shí)會(huì)有微小的性能損失

      • 當(dāng)使用in又要避免產(chǎn)生副本或提高性能,在聲明結(jié)構(gòu)體時(shí)要使用readonly struct

      原文地址?http://www.cnblogs.com/BeanHsiang/p/8687780.html


      .NET社區(qū)新聞,深度好文,歡迎訪問(wèn)公眾號(hào)文章匯總 http://www.csharpkit.com

    總結(jié)

    以上是生活随笔為你收集整理的这个拖后腿的“in”的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 丝袜视频一区 | 欧美日本三级 | 欧美日本另类 | 污视频在线网站 | 波多野结衣a v在线 欧洲免费av | av观看国产| 激情婷婷六月 | 国产经典久久 | 亚洲美女一区二区三区 | 一区三区视频在线观看 | 中文幕无线码中文字夫妻 | 国产图区| 国产一区二区三区在线播放无 | 欧美大片一区二区三区 | 在线播放不卡 | 日韩黄色高清视频 | 都市豪门艳霸淫美妇 | 日韩一区二区三区av | 一集毛片 | 99av国产精品欲麻豆 | 女女互慰吃奶互揉调教捆绑 | 成人hd| 欧美一级高潮片 | 亚洲v日本| 少妇系列av | 久久免费偷拍视频 | 伦理片一区二区三区 | 国产色爱| 中文字幕亚洲专区 | 特黄特色大片免费播放器使用方法 | 人与嘼交av免费 | av在线电影观看 | 久久黄色一级视频 | av漫画在线观看 | 中文字幕高清在线免费播放 | 久久日韩精品 | 伊人成年网| 玉女心经 在线 | 日韩在线精品视频一区二区涩爱 | 一区二区三区精彩视频 | 久久久久久久久久久久久久久久久久久久 | 欧美日本高清视频 | 四虎国产| 精品国产乱码久久久久久预案 | 色屁屁视频 | 日韩欧美大陆 | 久久人爽| 欧美a久久 | 一区二区三区视频在线观看免费 | 黄色片一区| 亚洲精品 欧美 | 影音先锋成人资源 | 欧美日韩中文字幕在线 | 国产精品成人网站 | 日韩另类 | 狠狠干香蕉 | 黄色91| 国产freexxxx性播放麻豆 | 亚洲欧美国产精品 | 久爱视频在线观看 | 婷婷六月激情 | 综合精品久久久 | 亚洲天堂影院在线观看 | 亚洲在线视频观看 | 亚洲精品一区在线观看 | 精品无码久久久久成人漫画 | 韩国一级片在线观看 | 国产成人在线精品 | 亚洲色图 欧美 | 日噜 | 中文字幕第4页 | 日韩欧美在线观看一区二区三区 | 欧美亚洲大片 | 国产靠逼网站 | 成人黄色片网站 | 3d成人动漫在线观看 | 伊人色图| 日本成人激情 | 麻豆免费在线观看 | 巨胸爆乳美女露双奶头挤奶 | 久久中文字幕在线 | 国产一区黄 | 欧美大片a| 麻豆免费观看网站 | avt天堂网 | 裸体裸乳被免费看视频 | 国产成人啪精品午夜在线观看 | 男生和女生一起搞鸡 | www.一区二区 | 超碰在线免费播放 | 国产精品视频一区二区三 | 欧美性久久久久 | 九九热视频这里只有精品 | 亚洲精品视频在线观看免费视频 | 亚洲精品高潮久久久久久久 | 中文字幕第18页 | 在线免费观看一区二区三区 | 公交顶臀绿裙妇女配视频 | 久久久欧美精品 |