《Mastering Delphi 6》學習筆記之七 (轉)
《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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ES6學習筆記(七)【class】筆記
- Go語言學習筆記(七)之方法Go筆記
- 前端學習筆記之ES6~~~前端筆記
- ES6學習筆記之Function筆記Function
- hive學習筆記之七:內建函式Hive筆記函式
- Redis阻塞(學習筆記七)Redis筆記
- HexMap學習筆記(七)——道路筆記
- 彙編學習筆記之轉移指令筆記
- java學習筆記6Java筆記
- vue學習筆記6Vue筆記
- ES6學習筆記之Set和Map筆記
- ES6語法學習筆記之promise筆記Promise
- webpack學習筆記七:配置babelWeb筆記Babel
- Vue.js 學習筆記之七:使用現有元件Vue.js筆記元件
- Java學習筆記——陣列練習(七)Java筆記陣列
- es6學習筆記筆記
- ES6 學習筆記筆記
- ES6 學習筆記筆記
- Laravel學習筆記七-建立部落格Laravel筆記
- Redis學習筆記(七) 資料庫Redis筆記資料庫
- 工作學習筆記(七)Java的介面筆記Java
- Delphi TMSMQTT使用筆記MQQT筆記
- .NET 6學習筆記(6)——SSL證書的匯出和格式轉換筆記
- ES6的學習筆記筆記
- ES6 學習筆記一筆記
- ES6 學習筆記二筆記
- ES6 學習筆記三筆記
- ES6 學習筆記四筆記
- Oracle學習筆記(6)——函式Oracle筆記函式
- G01學習筆記-6筆記
- iOS學習筆記47 Swift(七)泛型iOS筆記Swift泛型
- Java學習筆記——第七天Java筆記
- JavaWeb學習筆記——第七天JavaWeb筆記
- 飛機的 PHP 學習筆記七:WebPHP筆記Web
- Redis 學習筆記(篇七):Redis 持久化Redis筆記持久化
- vue學習筆記(七)---- vue中的路由Vue筆記路由
- JavaScript學習筆記(七)—— 再說函式JavaScript筆記函式
- Redis學習筆記七:主從叢集Redis筆記
- Docker筆記之七:RegistryDocker筆記