struct物件可能被分配在託管堆上嗎?
--會的。
比如當對struct裝箱的時候,就會被分配在託管堆上。
比如,讓乙個struct實現乙個介面。
public inte***ce ireport
}
public struct score : ireport
}
}再來乙個類負責列印介面屬性值的類和方法。
public class tester
}然後在main方法中如下呼叫:
static void main(string args)現在,我們想檢視在這過程中,struct是否發生了裝箱。
開啟"vs2012開發人員命令提示"。
導航到exe檔案所在的資料夾,然後用ildasm反編譯,把il**輸出到乙個1.txt檔案中。
我們看到,對struct物件進行了裝箱。
那麼,如何避免裝箱呢?
可以在tester類中,增加乙個泛型方法。
public class tester
public void testgeneric<t>(t report) where t : ireport
}然後在main方法中使用泛型方法。
static void main(string args)再次執行,再次反編譯,檢視il**:
我們發現,struct已不再裝箱。
why?
在泛型方法中限定了方法引數的型別,struct滿足型別的要求。當把struct物件作為實參傳入時,泛型方法直接使用struct,而不是ireport,從而避免了struct的裝箱。
分配在堆上還是分配在棧上及其區別
1.問題情景 由c 的string的變數分配在堆上,而不是分配在棧上引起的內容回顧。注釋 c 的string型別是引用型別,不同於int,float等值型別。2.解析 1 棧區 stack 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等,記憶體的分配是連續的,類似於平時我們所說的棧,如果還...
C 怎樣將C 物件分配在堆 棧上
相信一些朋友也碰見過這樣的面試題目,本文嘗試著給出解答.1.分配物件在堆上 那麼,必然要禁止物件在棧上面分配.乙個很簡單的辦法,就是建構函式私有化 提供額外的介面生成物件 那麼在棧上面就不可以分配.可是我們還需要這個物件要被析構,那麼可以提供乙個介面,顯式的釋放掉這個介面,也就是說delete也得給...
C new 堆上和棧上分配物件
1 說明 new 1 一種運算子 malloc是一種c中的庫函式 2 先分配物件 operator new 再構造物件,一般用於滿足自定義的類型別 2 原型 原型 void operator new size t throw bad alloc 解釋 該函式的返回值是乙個void 指標,同時有可能會...