2011-09-11 63 views
2

當我第一次看到C#中的值類型時,我認爲的第一件事是「哇,多麼好的優化」,第二件事是,「我們真的需要一種新的語言結構嗎?我們不能用註釋來做到這一點代替?」。可以通過內聯實現值類型嗎?

的想法是,給定的一類,我們將使用它,因爲我們總是這樣

class A {int i;} 
class B { 
    A m_a; 
    int F(A a) {m_a = a;} 
} 

一時興起,我們會改變A

[ValueType] 
class A {int i;int j;} 

編譯器會自動轉換B類是

class B { 
#region A 
    int A_i; 
    int A_j; 
#endregion 
int F(/*A param*/int i,int j) { 
#region A_assign 
    A_i = i; 
    A_j = j; 
#endregion 
} 

請記住,如果沒有按編譯」不希望優化某個實例 - 它不必。它會以任何方式工作。

它可能出現的問題與模板,

int f<T>() { 
    T t; // how much stack should I allocate 
} 

,但我不知道它比目前的情況更糟糕。我實際上不確定現在會發生什麼(f<struct_of_100_bytes>f<int>不同?)。

回答

2

現在想象一下繼承。或數組。或論據。或泛型。或者實現一個接口。或分配給對象/動態。

然後保存在運行時支持多編譯器的想法。

具有特定關鍵字(結構),而不是一個屬性是不是一個真正的大的變化(事實上,在CLI一切方面被稱爲類),但總體情況比你的例子要複雜得多。

基本上,結構做你提到的漂亮,很多的一切,並在列出的所有場景的作品。由於它通常(對於本地人)使用堆棧,它已經很像你描述的那樣。

重新提出「單獨功能」問題;首先,泛型不是「模板」(它是運行時間與編譯時間)。但仿製藥獲得每個值類型的一個JIT,每引用類型單一的JIT(因爲確實:堆棧佈局的變化

+0

您可以隨時退回到常規的對象(你犯了一個非常的混亂對象沒有內聯的嗎? )我並沒有真正看到(如在不明白,不同意),繼承(C++是否值類型繼承),數組,參數或泛型,還是實現接口乾擾內聯,在這三種情況下似乎都是可能的,你可以擴展一下嗎?也許一個例子會有幫助。 –

+0

@Elazar在傳遞接口作爲參數的情況下,例如,它根本沒有意義 - 調用者不會知道什麼但在一般情況下,這與結構體的工作方式非常相似,不知道這裏的意思是什麼 –

+0

哦,我明白了,當傳遞一個實現接口的結構體作爲函數參數時。這種情況下,我的意思是後備。)謝謝。另一個問題是,我聽說虛擬機本身支持值類型,而且單獨編譯器的合作似乎是可能的。 –

相關問題