This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Devirtualize virtual call hierarchy if just base dtor exists
- From: Martin LiÅka <mliska at suse dot cz>
- To: "gcc at gcc >> GCC Development" <gcc at gcc dot gnu dot org>
- Cc: "hubicka@ >> Jan Hubicka" <hubicka at ucw dot cz>
- Date: Wed, 22 Oct 2014 17:15:25 +0200
- Subject: Devirtualize virtual call hierarchy if just base dtor exists
- Authentication-results: sourceware.org; auth=none
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