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

Reply via email to