Re: Virtual destructors and vtable layout
On Oct 10, 5:21 pm, "Ole Nielsby"
<ole.niel...@tekareyouspamminglogisk.dk> wrote:
Component models like COM, UNO, XPCOM etc. rely on the vtable
layout being the same across compilers.
It depends on which component model, surely. And whichever tool
is used to generate the component interface will conform to
whatever the rules are for that interface.
I wonder what happens if virtual destructors are used.
I realise I shouldn't call virtual destructors across dll
borders, but it would be nice to be able to use them
internally in components, still.
Why wouldn't you call them across .DLL borders. We have code in
places that would require it, and it's never caused any
problems. Across numerous versions of Solaris and Linux, and
some versions of Windows.
My guess is, most compilers will deal with virtual destructors
like any other virtual functions, allocating vtable positions
in the order of declaration.
Just about every compiler lays vtables out differently. You
can't expect to link code compiled with one compiler with code
compiled with another. (That's the reason why consciencious
compiler implementers ensure that their name mangling is
different from that of other compilers. So you get an error at
link time, rather than really strange behavior at runtime.)
But then again, some compilers might use more than one
vtable slot, or allocate the virtual destructor at a fixed
negative offset for uniform treatment, or what do I know.
You don't have to worry about it. It's the compiler's problem.
I know vtable-layout isn't officially standardised but without
de facto-standards for vtable layout, these component models
would be hard to deal with.
The vtable layout used by the C++ compiler has nothing to do
with what the component model does. None of the component
models I'm familiar with even use a vtable, except insofar as
they map to C++ code, in which case, they're just normal C++
code.
How could they, when you think about it? The usual vtable
implementation contains pointers into the local process; by
definition, a component model allows calling between processes,
and generally between machines with different architectures.
(Otherwise, why bother with it.)
So I wonder if virtual destructors are dealt with in a de
facto standard way, or will they break the component models if
used?
(Why I want to know: I'm trying to design a lightweight
component model for in-proc dll addins and I'd like to
have a virtual destructor in the object base class - but
not if it makes the vtable layout compiler dependent.)
If you're designing a plugin interface, it's up to you to decide
how to define it, but usually, at least under Windows and Unix,
it's defined in terms of C, to leverage off the system-wide C
language API.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34