[英]Memory allocation of interface
我知道接口無法實例化,但如果我們將它分配給一個對象,任何人都可以解釋如何將內存分配給它。 例如:
ITest obj = (ITest) new TestClass1(); //TestClass1 is a class which implements ITest
obj.MethodsDefinedInInterface();
ITest是否轉換為對象以保存TestClass1的屬性和方法。
我不確定'分配'究竟是什么意思。 以下語句分為兩個單獨的“分配”:
TestClass1 test = new TestClass1();
首先是new TestClass1()
語句,它在堆上分配sizeof(TestClass1)。 其次,堆分配地址的賦值存儲在變量test
,該變量在堆棧上分配為sizeof(object *)(即IntPtr.Size,或基於硬件+ OS +軟件運行的32/64位) )。
以下聲明在“分配”中完全相同:
ITest test = new TestClass1();
兩者之間的唯一區別是可以在變量test
調用的方法。
注意:對於實現接口的結構,情況並非如此。 接口必須是引用類型,如您所知,結構不是。 這在.NET中稱為裝箱 ,並允許通過首先在堆上放置結構的副本來引用結構,就好像它是引用類型一樣。
所以我們現在重新評估聲明:
TestSTRUCT1 test2 = new TestSTRUCT1();
這在命名變量test2
的堆棧上“分配”sizeof(TestSTRUCT1)。 (不確定賦值給new TestSTRUCT1()
是什么,它可能會創建一個額外的堆棧副本,但應該在賦值后立即刪除。
如果我們然后將此值分配給接口:
ITest test3 = test2;
我們現在又做了兩次分配。 首先將結構復制到堆中。 然后,該堆駐留結構的地址被放置在新的“已分配”變量test3
(在堆棧上)。
它應該類似於:
TestClass1 test = new TestClass1();
ITest obj = (ITest) test;
obj.MethodsDefinedInInterface();
我認為,這回答了你的問題。
內存被分配給與任何其他對象一樣實現接口的對象。 它是否暗示接口只是對象的屬性
內存僅分配給TestClass1
實例。 接口ITest
只是一種引用,它指向分配的內存。
ITest是否轉換為對象以保存TestClass1的屬性和方法
ITest是一種類型。 TestClass1屬性和方法仍然存在,只是你無法通過obj變量訪問它。
它非常簡單。 您為TestClass1分配,然后將其強制轉換回接口。 請注意,您沒有實例化一個接口,您實例化一個實現該接口的類,然后調用在具體類中實現(必須)的接口方法!
另一種說法是:
TestClass1 test = new TestClass1();
ITest obj = (ITest) test;
obj.MethodsDefinedInInterface();
請注意,分配的區域是TestClass1! 它不會因為演員而成長或縮小!
interfaces
只需確保對象在編譯時在tecnically和邏輯上滿足cerain標准。
執行代碼並使用接口時,將分配內存,就好像您只是使用類實例化對象一樣。
所以兩者之間沒有區別(就內存分配而言)
ITest obj = (ITest) new TestClass1(); //TestClass1 is a class which implements ITest
obj.MethodsDefinedInInterface();
和
TestClass1 obj = new TestClass1(); //TestClass1 is a class which implements ITest
obj.MethodsDefinedInInterface();
因此,首先,當您輸入此方法時,將在堆棧上為所有參數(如果適用)分配空間,返回值(如果適用)以及該方法的所有局部變量。 對於我們在這里展示的內容,唯一需要分配的局部變量是obj
。 obj
是一個接口,因此需要足夠的空間用於單個引用(32位系統為32位,64位系統為64位)。 由於沒有其他局部變量,返回值或參數,我們只會占用堆棧中的那個字。
因為我們正在分配單個對象( new TestClass1()
)並假設該對象是一個類(而不是struct
,因為命名struct
TestClass1
將非常TestClass1
)將在堆上分配足夠的空間來解釋單個對象TestClass
實例。 對於每個單獨的字段(無論可訪問性),該空間都將有足夠的空間加上一些額外的對象開銷。 對這個新分配的對象的引用將進入為我們的局部變量分配的堆棧上的位置。
這都忽略了處理器在運行時使用的寄存器; 由於編譯器,抖動,操作系統,處理器硬件等的復雜轉換和優化,我無法開始嘗試預測會采取什么措施。 幸運的是,由於所有這些抽象,我真的不需要關心。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.