Update needed to binary compatibility guide for Windows?
Milian Wolff
mail at milianw.de
Tue Apr 15 12:43:42 BST 2014
On Sunday 13 April 2014 23:15:30 Nicolás Alvarez wrote:
> 2014-04-13 22:36 GMT-03:00 Michael Pyne <mpyne at kde.org>:
> > Hi all,
> >
> > In the past couple of days our Binary Compatibility in C++ TechBase page
> > [1] was posted to Reddit [2].
> >
> > That post received a response [3] which indicated that we're actually
> > missed a potential source of binary incompatibility with virtual
> > functions on Windows with MSVC.
> >
> > Specifically, that adding an override of an existing virtual function in a
> > class may cause other vtable function entries to be re-ordered. E.g. in
> > something like:
> >
> > class blah
> > {
> >
> > public:
> > virtual void func1(int arg);
> > virtual void func2(int arg);
> > virtual void func3(int arg);
> >
> > };
> >
> > Adding a virtual override "func2(char *arg)" to the *end* might cause the
> > vftable to line up as if declared in this order:
> >
> > class blah
> > {
> >
> > public:
> > virtual void func1(int arg);
> > virtual void func2(int arg);
> > virtual void func2(char *arg);
> > virtual void func3(int arg); // moved
> >
> > };
> >
> > Is anyone able to confirm this behavior on Windows? If it's true, do we
> > want to adopt a constraint on our handling of virtual functions in leaf
> > classes based on this? (Adding virtual methods is already not permitted
> > for non-leaf classes)
>
> I can confirm this behavior happens.
>
> I compiled this class:
> struct Testobj {
> virtual void func1();
> virtual void func2();
> virtual void func3();
> };
>
> And a program that calls func1(); func2(); func3();
>
> Then I added a func2(int) overload to the *end*:
> struct Testobj {
> virtual void func1();
> virtual void func2();
> virtual void func3();
> virtual void func2(int);
> };
>
> and recompiled the class but not the program using the class.
>
> Output of calling func1(); func2(); func3(); was
> This is func1
> This is func2 taking int
> This is func2
>
> This shows that if I declare func1() func2() func3() func2(int), the
> vtable is laid out as func1() func2(int) func2() func3().
>
> Tested with MSVC2010.
Awesome, please add this information to the guide on the wiki. The page is a
quite helpful one, i.e. no wonder it was posted to reddit. Having it as
extensive as possible is a good thing imo.
Cheers
--
Milian Wolff
mail at milianw.de
http://milianw.de
More information about the kde-core-devel
mailing list