《Mastering Delphi 6》學習筆記之七 (轉)

worldblog發表於2007-12-09
《Mastering Delphi 6》學習筆記之七 (轉)[@more@]

《Mastering 6》 學習筆記之七

 

T中的ClassParent是一個很讓人感興趣的方法。透過這個方法,你可以從某個類開始,層層上溯,一直到整個VCL的根TObject為止,描述出一個完整的層次列表。可以用下面的例子來檢查類繼承關係::namespace prefix = o ns = "urn:schemas--com::office" />

procedure TForm1.Button1Click(Sender: TObject);

var

  CurrObject : TObject;

  CurrClass : TClass;

begin

  CurrObject := Sender;

  while CurrObject<>nil do begin

  Memo1.Lines.Add( 'Class name is ' + CurrObject.ClassName );

  Memo1.Lines.Add( 'Instance Size is ' + IntToStr(CurrObject.InstanceSize) );

  Memo1.Lines.Add( '' );

  CurrClass := CurrObject.ClassParent;

  if CurrClass<>nil then

  CurrObject := CurrClass.NewInstance

  Else

  CurrObject := nil;

  end;

end;

注意上面的程式碼實際上是有問題的---用了NewInstance而沒有釋放。不過作為示例就不必再複雜化了,瞭解用法即可。

 

上面例子的輸出:

ClassName is TButton

Instance Size is 536

 

Class name is TButtonControl

Instance Size is 524

 

Class name is TWinControl

Instance Size is 516

 

Class name is TControl

Instance Size is 348

 

Class name is TComponent

Instance Size is 48

 

Class name is TPersistent

Instance Size is 4

 

Class name is TObject

Instance Size is 4

可以看到,TObject和TPersistent都是不包含任何成員變數的(4個位元組用於VTbl)。同時可以看到,TControl和TWinControl都是相當大的類,其中一定增加了不少成員變數。而一個TButton佔用的多達536個位元組,也就是說,2個按鈕就要超過1K,這多少讓人有點吃驚。(如果你想用SizeOf的話,不會得到正確的結果:所有的用Sizeof得到的結果都是4,這說明所謂的物件其實都是指標而已。)看來雖說現在記憶體越來越大,但是一個窗體上的構件還是不要太多的為好。

 

由於TButton佔用的記憶體之大出乎意外,所以我又作了個,把常用的幾十種構件都放了進去,看看佔用的記憶體大小如何。程式碼很簡單:

procedure TForm1.FormCreate(Sender: TObject);

var

  i : integer;

 Item : TListItem;

  Size : integer;

begin

  for i:=0 to ComponentCount-1 do begin

  Item := ListView1.Items.Add;

  Item.Caption := Components[i].ClassName;

  Size := Components[i].InstanceSize;

  Item.SubItems.Add( IntToStr(Size) );

  end;

end;

從結果來看,大致可以得出如下的結論:

1.非視窗構件(如TShape,TBevel)的InstanceSize大多在300多個位元組;

2.基本的視窗化構件(如TButton,TEdit,TListBox)的InstanceSize大多在500到600多個位元組,屬於Common Control的佔用量還要更多一些;

3.各種各樣的網格構件(TStringGrid,TDrawGrid)佔用空間都比較大(700多個位元組),TGrid甚至達到了800個位元組。

4.各種和相關的構件都比較大,一般在700多到900位元組不等,只有TData出乎意料的小—88個位元組。

5.包括上面說到的TDataSource在內,還有幾個構件也非常之小,它們是TMainMenu, TActionList,TCustomizeDlg,TTimer和TDataSource,只有80-90多個位元組,而其他構件最少也有300多個位元組。我沒有找到哪個構件的大小在100-300位元組這個區間。

6.在我測試到所有構件中,其InstanceSize最大的是TChart,達到了1024個位元組。

7.新增的ListView和ShellTreeView也是消耗記憶體的大戶,ShellTreeView消耗的位元組數達到968位元組,僅次於TChart而位居亞軍。

不知道你看了這個結果有何感想,我想Delphi之所以這麼消耗記憶體和啟動速度比較慢大概也是因為這個原因吧,總之構件雖好,也不可以濫用就是了。

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990461/,如需轉載,請註明出處,否則將追究法律責任。

相關文章