Devirtualize virtual call hierarchy if just base dtor exists

Martin Liška mliska@suse.cz
Wed Oct 22 15:15:00 GMT 2014


Hello.

I've been playing with following example:

#include <stdlib.h>

class Base
{
public:
   virtual ~Base() {}
};

class Derived: public Base
{
};

#define N 1000

int main()
{
   Base **b = (Base **)malloc (sizeof(Base *) * N);
   for (unsigned i = 0; i < N; i++)
     b[i] = new Derived();

   for (unsigned i = 0; i < N; i++)
     delete b[i];

   return 0;
}

Where I would like to somehow give an advice to devirtualize machinery. My motivation is to inline destruction in 'delete b[i]'.
'final' keyword does not solve my problem:

a.c:9:7: error: virtual function ‘virtual Derived::~Derived()’
  class Derived: public Base
        ^
a.c:6:11: error: overriding final function ‘virtual Base::~Base()’
    virtual ~Base() final {}

If I enclose my classes to anonymous namespace:

Procesing function int main()/172
   Targets of polymorphic call of type 0:struct Base token 2
     Contained in type:struct Base at offset 0
     This is a complete list. (derived types included)
        virtual {anonymous}::Base::~Base()/164 virtual {anonymous}::Derived::~Derived()/183

More than one likely target


My question is how can one help compiler if he knows that a class hierarchy is complete and there's no destructor except the virtual for base class?

Thank you,
Martin



More information about the Gcc mailing list