オブジェクトのサイズを取得する
|
75 |
ClassInstanceSize |
動作確認 |
Delphi2007 |
更新日 |
2008/02/03(日) |
record型や変数のサイズを知るにはSizeOf関数を使います。
クラスの場合実質ポインタですので
SizeOfを使ってもポインタが
32bit整数値なので"4バイト"としか取得できません。
そこで TObject.InstanceSize を使ってサイズを取得することができます。
────────────────────
type
TInteger = record
FMember: Integer;
end;
TIntegerClass = class
FMember: Integer;
end;
TMyRecord = record
FMember: array[0..9] of Integer;
end;
TMyClass = class
FMember: array[0..9] of Integer;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
size: integer;
begin
size := SizeOf(TInteger);
Memo1.Lines.Add(IntToStr(size));
size := TIntegerClass.InstanceSize;
Memo1.Lines.Add(IntToStr(size));
size := SizeOf(TMyRecord);
Memo1.Lines.Add(IntToStr(size));
size := SizeOf(TMyClass);
Memo1.Lines.Add(IntToStr(size));
size := TMyClass.InstanceSize;
Memo1.Lines.Add(IntToStr(size));
end;
────────────────────
実行結果は次のようになります。
4
8
40
4
44
クラスがrecord型より4バイト増えています。
参考────────────────────
[Delphi:51020] Re: クラスのサイズ
http://www2.big.or.jp/~osamu/Delphi/browse.cgi?index=51020
[Delphi-ML:51016] クラスのサイズ(Re:動的に recordを作成するには)
http://www2.big.or.jp/~osamu/Delphi/browse.cgi?index=51016
ここにはClass型が4バイトだけ理由が書かれていて
VMTという単語がでています。
VMTについて調べてみると
VMT(仮想メソッドテーブル)とは何か
http://kakinotane.s7.xrea.com/delphi/faq/f002.html#i4
ここが参考になります。
|