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());
}
_______________________________________________
Mailing list: https://launchpad.net/~kicad-developers
Post to : [email protected]
Unsubscribe : https://launchpad.net/~kicad-developers
More help : https://help.launchpad.net/ListHelp