如果你有一個方法或類型Foo<T>
,那麼CLR可以爲不同的T編譯多個版本。我知道所有的引用類型共享相同的版本。它是如何工作的結構?對於不同的結構,代碼是否有時共享,或者從不共享?例如,我可以想象代碼是爲所有相同大小的結構共享的。何時在CLR中爲泛型的不同實例共享代碼?
我很感興趣,因爲我想了解一下下面的例子:
interface IBar
{
void DoBar();
}
struct Baz : IBar
{
public void DoBar(){ ... }
}
struct Quux : IBar
{
public void DoBar(){ ... }
}
現在,如果我做了以下內容:
public void ExecuteBar<T>(T bar) where T:IBar
{
bar.DoBar();
}
ExecuteBar(new Baz());
ExecuteBar(new Quux());
這是否會產生ExecuteBar
兩個版本,每一個直接(非虛擬)直接撥打Bar.DoBar()
和Quux.DoBar()
?或者是在運行時完成調度?
正確。所以我猜想,在提問者感興趣的層面上,答案是:前一種替代方法創建了兩種不同的方法,每種類型都有一種方法,並且調度是非虛擬的。 – 2014-09-01 22:48:13
謝謝! @傑普:是的。可能是這種情況,代碼通過內聯進一步優化,而且效率更高,但我對結構體上的接口調用的基線性能模型感興趣,這些結構體的類型顯式作爲參數傳遞給泛型方法或類。我知道你不應該依賴這種行爲,但它可以作爲優化的起點。如果派遣正在減慢代碼速度,可能值得將類更改爲結構以消除派遣。 – Jules 2014-09-02 07:43:39