簡體   English   中英

靜態方法與非靜態方法[雙重] 5

[英]Static Methods Vs Non-Static Methods[dulicate]5

我對運行時會發生什么有疑問。

假設我創建了一個對象。 在堆棧上有一個引用,對象1st存儲在堆中的空間。

DataMembers(int a = 10 ....)存儲在對象的空間中。 如果對象的類具有虛擬方法,則將有8字節的vpointer指向堆上另一個地址上的VirtualTable。

假設我只有非靜態方法。 因此,對象僅存儲指向我的類的類型對象的方法表的指針。

我希望我的第一部分是正確的:)

如果我是對的...。我想知道當本地的Constructions想要調用對象的非靜態方法時會發生什么? 非靜態方法真正存儲在哪里? 導致靜態方法的存儲空間有所不同(它們存儲在調用的Type Object表中...對!!)

我的建議:

我的類的類型對象的方法表具有被稱為方法的名稱。 此方法在堆棧上獲得一些空間,稱為堆棧框架。 該框架存儲了方法的參數以及一個稱為this的不可見常量指針。 該指針指向堆上對象的地址。

每個方法的代碼都存儲在內存中的某個位置 這在哪里並不重要。

每當代碼調用靜態方法或非虛擬實例方法時,編譯器都會在編譯時知道需要調用的確切代碼。 它可以確保代碼可以直接引用適當的方法的代碼。 而已; 完成。 呼叫站點僅直接引用該方法。

對於非靜態虛擬方法,編譯器在編譯時不知道實際執行了哪種方法。 在表示該對象的數據中,每個單個引用類型對象都有一些類型信息。 調用該虛擬方法時,將檢查對象的類型信息。 該類型信息包括一個v表。 一個表,該表指示對任何給定方法應運行的代碼塊的引用。 該表中插入了需要運行的方法,然后彈出對應該運行的方法的引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM