Devirtualize virtual call hierarchy if just base dtor exists

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


On 10/22/2014 05:30 PM, Markus Trippelsdorf wrote:
> On 2014.10.22 at 17:15 +0200, Martin Liška wrote:
>> 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 {}
>
> What about:
>
> class Derived final: public Base {};
>

Yes, that works, but it allows one to have a different class that inherits from the Base class.

Martin



More information about the Gcc mailing list