[fpc-pascal] Interface performance
Tony Whyman
tony.whyman at mccallumwhyman.com
Fri Nov 11 14:54:37 CET 2016
> Isn’t MyObject2 still pointing to MyObject1?
If you go back to the FPC documentation, in the User Guide it says
"Objects are stored in memory just as ordinary records with an extra
field: a pointer to the Virtual Method Table (VMT)." My understanding is
that an interface is stored similarly, except that a different VMT is
used i.e. that which defines the interface. If you try and assign one to
the other by just coercing the type then you will get undefined results.
On 11/11/16 11:25, Ryan Joseph wrote:
>> On Nov 11, 2016, at 5:52 PM, Tony Whyman <tony.whyman at mccallumwhyman.com> wrote:
>>
>> Someone else may correct me, but with CORBA, I believe you have to explicitly add a function to the interface such as
>>
>> function GetObject: TMyObject;
>>
>> and implement as
>>
>> function TMyObject.GetObject: TMyObject;
>> begin
>> Result := self;
>> end;
> I think I’m out of time now but I’ll try this in my code that was crashing before.
>
> How is this different from just casting the interface to an object? There’s your example below basically like I was doing it before with the seemingly random crashes. Isn’t MyObject2 still pointing to MyObject1?
>
> type
> IMyInterface = interface
> procedure MyProc;
> end;
>
> TMyObjectClass = class(TInterfacedObject,IMyInterface)
> public
> procedure MyProc;
> end;
>
> var MyObject1, MyObject2: TMyObjectClass;
> MyInterface: IMyInterface;
>
> begin
> MyObject1 := TMyObjectClass.Create;
> MyInterface := MyObject1;
>
> MyInterface.MyProc;
>
> MyObject2 := TMyObjectClass(MyInterface);
>
> MyObject1.Free {OK for CORBA - will cause an exception in COM}
> {MyObject1, MyObject2 and MyInterface are now all invalid}
> end;
>
>
> Regards,
> Ryan Joseph
>
> _______________________________________________
> fpc-pascal maillist - fpc-pascal at lists.freepascal.org
> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
>
More information about the fpc-pascal
mailing list