裝箱將值類型轉換爲對象類型。或者像MSDN所說的那樣,裝箱是一種「將托架堆上的引用類型對象內的結構包裝起來的操作」。C# - 可以將箱子放在一起嗎?
但是,如果您嘗試通過查看IL代碼來深入瞭解,您只能看到魔術字「盒子」。
投機,我想,運行時有某種仿製藥爲主的祕密級了它的袖子,像Box<T>
與public T Value
屬性,拳擊一個int會是什麼樣子:
int i = 5;
Box<int> box = new Box<int>;
box.Value = 5;
拆箱的INT會更便宜:return box.Value;
不幸的是,我的性能需求量很大的服務器應用程序做了一些拳擊,特別是小數點。更糟糕的是,這些盒子壽命很短,這讓我懷疑我付了兩次,一次用於裝盒,然後再用垃圾箱收集盒子。
如果我自己分配這個內存,我會考慮在這裏使用對象池。但是由於實際的對象創建隱藏在IL中的一個魔術字背後,我有什麼選擇?
我的具體問題:
- 是否有誘導運行拿箱子從池中,而不是instanciating他們現有的機制?
- 拳擊期間創建的實例的類型是什麼?是否有可能手動控制拳擊過程,但仍然與拆箱兼容?
如果這最後一個問題似乎很奇怪,我的意思是,我可以手動創建自己的Box<T>
或DecimalBox
類,池吧,盒/拆箱。但我不想去修改代碼中使用盒裝值的各個地方(又名unbox)。
你有沒有考慮通過利用泛型/自定義對象/等減少拳擊操作? 「盒子」指令是故意不透明的,儘管你可以通過上面的「盒子」類來模仿它。 –
dlev
「我的應用程序做了一些拳擊」。一場奇怪的比賽,唯一的勝利舉動就是不玩。 –
「更糟糕的是,這些盒子壽命很短,這讓我懷疑我付了兩次,一次用於裝盒,然後再用垃圾箱收集盒子。」你介紹了這個,對吧?即你知道GC是你應用程序中的瓶頸,因爲你測量了,而不是因爲你猜測。我設法獲得GC綁定的唯一時間是頻繁分配大型字節數組。如果Gen0系列是瓶頸,你應該重新考慮你的設計。 – CodesInChaos