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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Dictionary里使用struct,enum做key

發布時間:2024/4/15 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Dictionary里使用struct,enum做key 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先看下Dictionary的源碼

public void Add (TKey key, TValue value){if (key == null)throw new ArgumentNullException ("key");// get first item of linked list corresponding to given keyint hashCode = hcp.GetHashCode (key) | HASH_FLAG;int index = (hashCode & int.MaxValue) % table.Length;int cur = table [index] - 1;// walk linked list until end is reached (throw an exception if a// existing slot is found having an equivalent key)while (cur != NO_SLOT) {// The ordering is important for compatibility with MS and strange// Object.Equals () implementationsif (linkSlots [cur].HashCode == hashCode && hcp.Equals (keySlots [cur], key))throw new ArgumentException ("An element with the same key already exists in the dictionary.");cur = linkSlots [cur].Next;}if (++count > threshold) {Resize ();index = (hashCode & int.MaxValue) % table.Length;}// find an empty slotcur = emptySlot;if (cur == NO_SLOT)cur = touchedSlots++;else emptySlot = linkSlots [cur].Next;// store the hash code of the added item,// prepend the added item to its linked list,// update the hash tablelinkSlots [cur].HashCode = hashCode;linkSlots [cur].Next = table [index] - 1;table [index] = cur + 1;// store item's data keySlots [cur] = key;valueSlots [cur] = value;generation++;}

  

int hashCode = hcp.GetHashCode (key) | HASH_FLAG;

hcp

[Serializable]sealed class DefaultComparer : EqualityComparer<T> {public override int GetHashCode (T obj){if (obj == null)return 0;return obj.GetHashCode ();}public override bool Equals (T x, T y){if (x == null)return y == null;return x.Equals (y);}}

其實就是走到obj.GetHashCode,如果obj.GetHashCode沒有覆蓋的話,那就會走到ValueType的GetHashCode

public override int GetHashCode (){object[] fields;int result = InternalGetHashCode (this, out fields);if (fields != null)for (int i = 0; i < fields.Length; ++i)if (fields [i] != null)result ^= fields [i].GetHashCode ();return result;}

注意看

[MethodImplAttribute (MethodImplOptions.InternalCall)]internal extern static int InternalGetHashCode (object o, out object[] fields); int result = InternalGetHashCode (this, out fields);
會把this轉成object類型,第1次boxing,而且會把每個字段都轉成object,放入fields里,所以會有多次gc alloc
這個是不重載GetHashCode導致的gc alloc。
下一個是 if (linkSlots [cur].HashCode == hashCode && hcp.Equals (keySlots [cur], key))

hcp.Equals

如果T沒有實現IEquatable,就會走到DefaultCOmparer,然后會走到

這個Equals會調用ValueType.Equals

internal static bool DefaultEquals (object o1, object o2){object[] fields;if (o2 == null)return false;bool res = InternalEquals (o1, o2, out fields);if (fields == null)return res;for (int i = 0; i < fields.Length; i += 2) {object meVal = fields [i];object youVal = fields [i + 1];if (meVal == null) {if (youVal == null)continue;return false;}if (!meVal.Equals (youVal))return false;}return true;}// <summary>// True if this instance and o represent the same type// and have the same value.// </summary>public override bool Equals (object obj){return DefaultEquals (this, obj);}

這個里面會把x,y都轉成object.所以會有2次boxing

至此所有的boxing都清楚了,工程例子在

https://github.com/yingsz/DictionaryAlloc

消除boxing參考

http://www.bkjia.com/Asp_Netjc/1314145.html

轉載于:https://www.cnblogs.com/marcher/p/10150622.html

總結

以上是生活随笔為你收集整理的Dictionary里使用struct,enum做key的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日日草日日干 | 国内成人av | 午夜黄色福利视频 | 糖心logo在线观看 | 欧美色图视频在线 | 午夜亚洲一区 | 狠狠操很很干 | 天天精品视频 | 催眠美妇肉奴系统 | 99热热99| 狼人伊人av | 一本高清dvd在线播放 | 中国在线观看视频高清免费 | 韩国伦理片观看 | 午夜av导航 | 久久久久无码精品国产sm果冻 | 国产精品6666 | 少妇大叫太粗太大爽一区二区 | 日韩伦乱 | 天堂在线免费观看视频 | 黄色片免费观看视频 | 欧美污污视频 | 国产三级伦理片 | 尤物精品视频在线观看 | 日本免费在线一区 | 国产毛片18 | 黄色av网站在线 | 爆操欧美美女 | 欧美三p| 97人妻一区二区精品免费视频 | 伊人av网站 | 国产在线一区二 | 午夜在线一区二区 | 中文字幕亚洲无线码在线一区 | 黄色一级二级 | 国产免费99| 免费处女在线破视频 | 草草在线观看 | 国产女在线 | 丁香婷婷亚洲 | 人妻一区二区三区在线 | 国产精品海角社区 | 蜜臀尤物一区二区三区直播 | 免费涩涩视频 | 懂色av一区二区 | 最新久久 | 操操日日 | 亚洲理论中文字幕 | 影音先锋中文字幕在线 | 嫩草网站 | 欧美一级在线视频 | 手机看片一区二区 | 丰满大乳奶做爰ⅹxx视频 | 三级欧美韩日大片在线看 | 在线国产三级 | 少妇特黄一区二区三区 | 午夜精品福利一区二区 | 乱亲女h秽乱长久久久 | 在线免费观看黄色 | 国产精品嫩草69影院 | 桃花色综合影院 | 午夜高清福利 | 1024在线视频 | 一区二区三区福利视频 | 美女脱衣服一干二净 | 久久精品网址 | 欧亚av | 午夜xxxx| 久久精品6| 一区二区三区四区在线播放 | 激情自拍偷拍 | 亚洲一级黄色 | 成人在线午夜 | 18禁超污无遮挡无码免费游戏 | 日本 奴役 捆绑 受虐狂xxxx | 天堂a√在线 | 91精品久久久久久久久 | 好吊视频在线观看 | 91超薄肉色丝袜交足高跟凉鞋 | 男女互操在线观看 | 欧美不卡在线 | 久久成人a | 亚洲综合成人亚洲 | 捆绑无遮挡打光屁股调教女仆 | 久久免费视频网 | 九色自拍视频 | 国产欧美精品 | 夜夜爱爱 | 国产一区二区精彩视频 | 黄色网页在线看 | av中文字幕免费 | 日韩精品国产精品 | 在线免费观看小视频 | 久久99国产综合精品免费 | 成人91看片 | 国产三级精品在线观看 | 久久精品高清视频 | www.色播| 国产小视频免费在线观看 |