This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug libstdc++/50661] New: std::equal should use more efficient version for arrays of pointers
- From: "emil at wojak dot eu" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Fri, 07 Oct 2011 23:16:23 +0000
- Subject: [Bug libstdc++/50661] New: std::equal should use more efficient version for arrays of pointers
- Auto-submitted: auto-generated
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50661
Bug #: 50661
Summary: std::equal should use more efficient version for
arrays of pointers
Classification: Unclassified
Product: gcc
Version: 4.4.5
Status: UNCONFIRMED
Severity: enhancement
Priority: P3
Component: libstdc++
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: emil@wojak.eu
The following program uses the generic comparison algorithm in
bits/stl_algobase.h, while it could use the template specialization using
__builtin_memcmp instead.
#include <iostream>
#include <boost/array.hpp>
int main() {
boost::array<void*, 888> a, b;
bool res = std::equal(a.begin(), a.begin() + 50, b.begin());
return 0;
}
I checked with gcc-4.4.5, but I saw it's the same in SVN trunk.
The following patch solves this issue.
--- /usr/lib/gcc/i686-pc-linux-gnu/4.4.5/include/g++-v4/bits/stl_algobase.h
2011-09-07 16:34:35.581681814 +0200
+++ /usr/lib/gcc/i686-pc-linux-gnu/4.4.5/include/g++-v4/bits/stl_algobase.h
2011-10-08 01:09:44.987380358 +0200
@@ -823,7 +823,7 @@
{
typedef typename iterator_traits<_II1>::value_type _ValueType1;
typedef typename iterator_traits<_II2>::value_type _ValueType2;
- const bool __simple = (__is_integer<_ValueType1>::__value
+ const bool __simple = ((__is_integer<_ValueType1>::__value ||
__is_pointer<_ValueType1>::__value)
&& __is_pointer<_II1>::__value
&& __is_pointer<_II2>::__value
&& __are_same<_ValueType1, _ValueType2>::__value);