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:
Jason Merrill 2022-09-06 10:35:21 -04:00
parent 0a91bdaf17
commit 873d395c29

View file

@ -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)