On 30/05/15 09:36 +0000, Jörg Richter wrote:
>How about comparing only the length against 0?
>The pointers must be != 0 if length > 0.

Like so? Yes, that's probably an improvement, because we need that
length anyway.

Yes, that is what I had in mind.
I think the second case can be handled equally by
precomputing std::min(__len1, __len2).

Yep, that's better too, I've tested and committed this patch. Thanks
for the suggestions.


commit 12ae71c3947824fa096113a418c7fe9e2ba89d19
Author: Jonathan Wakely <jwak...@redhat.com>
Date:   Fri May 29 23:48:55 2015 +0100

    	* include/bits/stl_algobase.h (__equal<true>::equal): Check length
    	instead of checking for null pointers.
    	(__lexicographical_compare<true>::__lc): Only check shorter length.

diff --git a/libstdc++-v3/include/bits/stl_algobase.h b/libstdc++-v3/include/bits/stl_algobase.h
index db065e2..12eb7ec 100644
--- a/libstdc++-v3/include/bits/stl_algobase.h
+++ b/libstdc++-v3/include/bits/stl_algobase.h
@@ -812,11 +812,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
         static bool
         equal(const _Tp* __first1, const _Tp* __last1, const _Tp* __first2)
         {
-	  if (__first1 == 0 || __first2 == 0)
-	    return __first1 == __last1;
-
-	  return !__builtin_memcmp(__first1, __first2, sizeof(_Tp)
-				   * (__last1 - __first1));
+	  if (const size_t __len = (__last1 - __first1))
+	    return !__builtin_memcmp(__first1, __first2, sizeof(_Tp) * __len);
+	  return true;
 	}
     };
 
@@ -920,14 +918,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	{
 	  const size_t __len1 = __last1 - __first1;
 	  const size_t __len2 = __last2 - __first2;
-	  if (__len1 && __len2)
-	    {
-	      if (int __result = __builtin_memcmp(__first1, __first2,
-						  std::min(__len1, __len2)))
-		{
-		  return __result < 0;
-		}
-	    }
+	  if (const size_t __len = std::min(__len1, __len2))
+	    if (int __result = __builtin_memcmp(__first1, __first2, __len))
+	      return __result < 0;
 	  return __len1 < __len2;
 	}
     };

Reply via email to