libstdc++: small dynamic_cast optimization
This change speeds up the simple benchmark below by about 40%. struct A { virtual ~A() {} }; struct B: A { } b; A* ap = &b; void *sink; int main() { for (long i = 0; i < 4000000000L; ++i) sink = dynamic_cast<B*>(ap); } libstdc++-v3/ChangeLog: * libsupc++/dyncast.cc (__dynamic_cast): Avoid virtual function call in simple success case.
This commit is contained in:
parent
0a91bdaf17
commit
873d395c29
1 changed files with 6 additions and 0 deletions
|
@ -71,6 +71,12 @@ __dynamic_cast (const void *src_ptr, // object started from
|
|||
if (whole_prefix->whole_type != whole_type)
|
||||
return NULL;
|
||||
|
||||
// Avoid virtual function call in the simple success case.
|
||||
if (src2dst >= 0
|
||||
&& src2dst == -prefix->whole_object
|
||||
&& *whole_type == *dst_type)
|
||||
return const_cast <void *> (whole_ptr);
|
||||
|
||||
whole_type->__do_dyncast (src2dst, __class_type_info::__contained_public,
|
||||
dst_type, whole_ptr, src_type, src_ptr, result);
|
||||
if (!result.dst_ptr)
|
||||
|
|
Loading…
Add table
Reference in a new issue