Daniël Mantione wrote:
Op Tue, 5 Feb 2008, schreef Marc Weustink:
Daniël Mantione wrote:
Op Tue, 5 Feb 2008, schreef Luiz Americo Pereira Camara:
can i safely use the below object instead of the record and pass
directly to the c function?
TMyObj = object
x: Integer;
y: Integer;
Method1;
Method2;
end;
PMyObj = ^TMyObj;
Yes, objects (by specification) are defined to have the same binary
layout as records.
Moreover, whats the difference between objects and records with
methods (the new Delphi feature)?
Objects can have virtual methods, constructors, destructors. The new
Delphi feature cannot.
however with virtuals or constructors/destructors, the memory layout
is not 100% the same as a record.
A constructor doesn't add a vmtlink. A virtual method does, and a
destructor too because they are virtual. It is never a problem in
practise, because you can declare the virtual method in a descendent, i.e.:
type Tbinary_compatible_obj=object
a,b,c,d,e,f:byte;
constructor init;
end;
Tbinary_compatible_obj_with_vmt=object(Tbinary_compatible_record)
constructur init;
procedure virtualmethod;virtual;
desctructor done;virtual;
end;
In the above example, you can perfectly pass a
Tbinary_compatible_obj_with_vmt instance to any C library expecting a
Tbinary_compatible_obj, because the vmtlink is located after the fields
and therefore does not interfere with the binary structure.
it might be a compiler bug, but when I tried to zeromem a object having
a constructor it resulted in an IE. Without a constructor not. That way
I came to a conlusion that an object+constructor is not 100% the same as
a simple record.
Marc
_______________________________________________
fpc-pascal maillist - fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal