mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-22 07:09:29 +02:00
69 lines
1.3 KiB
ObjectPascal
69 lines
1.3 KiB
ObjectPascal
|
|
{ Variation without virtual classes : no VMT }
|
|
{ here sizeof directly returns a constant value }
|
|
|
|
|
|
type
|
|
pbaseclass = ^tbaseclass;
|
|
pderivedclass = ^tderivedclass;
|
|
|
|
tbaseclass = object
|
|
x : byte;
|
|
function getsize : longint; static;
|
|
procedure check_size;
|
|
end;
|
|
|
|
tderivedclass = object(tbaseclass)
|
|
y : byte;
|
|
end;
|
|
|
|
const
|
|
expected_size_for_tbaseclass = sizeof(byte);
|
|
expected_size_for_tderivedclass = 2*sizeof(byte);
|
|
|
|
var
|
|
basesize : longint;
|
|
derivedsize : longint;
|
|
|
|
function tbaseclass.getsize : longint;
|
|
begin
|
|
{ self = pointer to VMT }
|
|
getsize:=sizeof(self);
|
|
end;
|
|
|
|
procedure tbaseclass.check_size;
|
|
begin
|
|
if getsize<>sizeof(pointer) then
|
|
begin
|
|
Writeln('Compiler creates garbage ',sizeof(self),'<>',sizeof(pointer));
|
|
halt(1);
|
|
end;
|
|
end;
|
|
|
|
|
|
var
|
|
cb : tbaseclass;
|
|
cd : tderivedclass;
|
|
c1 : pbaseclass;
|
|
begin
|
|
new(c1);
|
|
|
|
basesize:=sizeof(cb);
|
|
Writeln('Sizeof(cb)=',basesize);
|
|
if basesize<>expected_size_for_tbaseclass then
|
|
begin
|
|
Writeln('not the expected size : ',expected_size_for_tbaseclass);
|
|
halt(1);
|
|
end;
|
|
|
|
derivedsize:=sizeof(cd);
|
|
Writeln('Sizeof(ct)=',derivedsize);
|
|
if derivedsize<>expected_size_for_tderivedclass then
|
|
begin
|
|
Writeln('not the expected size : ',expected_size_for_tderivedclass);
|
|
halt(1);
|
|
end;
|
|
|
|
cb.check_size;
|
|
end.
|