2009-01-27 33 views
2

有沒有辦法在Delphi中獲取類實例的實際大小?德爾福的遞歸類實例大小

我知道TObject類的InstanceSize方法,但該方法不會遞歸地爲對象成員調用自身。例如,讓我們說,我們有兩個類:

type MyClass1 = class 
    private 
    myVar1 : integer; 
    myVar2 : integer; 
end; 

type MyClass2 = class 
    private 
    myOtherVar1 : integer; 
    myOtherVar2 : MyClass1; 
end; 

此段的代碼,MyClass1的將是(對於類的開銷的4字節的各整數加上4)12字節長度和MyClass2將是24個字節lengh( 4個字節用於類開銷,12個字節來自myOtherVar2,另外4個用於myOtherVar1整數)。因爲myOtherVar2被解釋爲一個指針(4字節)而不是類別引用,所以使用InstanceSize將導致它們中的每一個都有12個字節。

有沒有辦法獲得類的總大小,包括對其他類實例的引用?

回答

15

構造一個MyClass1對象和一百萬個MyClass2,使每個MyClass2指向相同的MyClass1。

每個MyClass2需要多少內存? 12.000012字節?

循環列表需要多少內存?無限,因爲你可以永遠追逐指針?

在帶指針的語言中,一個簡單的遞歸大小算法通常沒有用處。您需要編寫自己的算法,其中包含有關聚合/合成,共享和遞歸引用的具體知識,具體介紹如何使用對象。

+0

或換句話說:你想走多深?如果ObjectA引用ObjectB,它引用ObjectC,它引用.......,那麼ObjectA的真正「內存使用」是什麼? – 2009-01-28 02:03:47

1

沒有你想要的東西不存在。如果你想要這樣的東西,你應該自己寫。

1

這聽起來像你想計算你的對象使用的內存。

如果您需要這樣做,您可以檢查FastMM如何執行此操作,並且可能在創建類型的對象時掛鉤您的過程。

很多工作目標不明確;在開始之前你最好有一個很好的理由。

2

有沒有辦法讓總規模之類的 包括其參考 到其他類的實例?

你剛剛說過。參考是一個指針;它的大小是4個字節。 InstanceSize返回的值是爲類的實例數據分配的字節數。例如,我的其他變量2可能爲零。但是零指針值仍然會佔用4個字節的內存。

2

找出它使用多少內存,你可以讓對象不被釋放&讓FastMM告訴你泄漏的大小。