← Back to team overview

kicad-developers team mailing list archive

Re: dyn_cast

 

On 13.04.2016 18:19, Simon Richter wrote:
> Hi,
> 
> On 13.04.2016 18:13, Chris Pavlina wrote:
> 
>> What is the purpose of dyn_cast<> in include/core/typeinfo.h? Why don't we just
>> use dynamic_cast<>? And can we either replace the former with the latter, or
>> add a comment to the former explaining its purpose?
> 
> It uses the parallel type system in EDA_ITEM rather than RTTI, so it
> works if RTTI is broken, e.g. when compiling with gcc 2.95.
> 

I wrote it inspired with Clang/LLVM design which uses a very similar
pattern. Sorry Simon, I didn't consider compatibility with gcc 2.95
would be of an advantage. My reasons were:

1) Much faster (code in the attachment):
- dynamic_cast<> : 9090437 usecs
- dyn_cast<> : 1832433 usecs (5x improvement)

2) Lightweight & compatible with existing Kicad type system.

Cheers,
Tom
#include <cstdio>

#include "profile.h"
#include "typeinfo.h"

const int n_iter = 1000000000;

const int id_base = 0;
const int id_derived = 1;


class Base {
public:
    Base()
    {
	m_type = id_base;
    }

    virtual ~Base() {};

    static inline bool ClassOf( const Base* aItem )
    {
        return aItem && id_base == aItem->Type();
    }

    int Type() const
    {
	return m_type;
    }


protected:
    int m_type;
    int m_count;
};

class Derived : public Base {
public:
    static inline bool ClassOf( const Base* aItem )
    {
        return aItem && id_derived == aItem->Type();
    }

    Derived()
    {
	m_type = id_derived;
    }

    void DoSomething()
    {
	m_count++;
    }

};

main()
{
    Base *b = new Derived();

    prof_counter cnt;

    prof_start(&cnt);

    for(int i = 0; i <n_iter;i++)
    {
	Derived *d = dynamic_cast<Derived*> (b);
	d->DoSomething();
    }
    prof_end(&cnt);

    printf("dynamic_cast<> : %d usecs\n", cnt.usecs());

    prof_start(&cnt);


    for(int i = 0; i <n_iter;i++)
    {
	Derived *d = dyn_cast<Derived*>(b);
	d->DoSomething();
    }

    prof_end(&cnt);
    printf("dyn_cast<> : %d usecs\n", cnt.usecs());

}

Follow ups

References