mirror of git://gcc.gnu.org/git/gcc.git
libstdc++: Use unsigned division in std::rotate [PR113811]
Signed 64-bit division is much slower than unsigned, so cast the n and k values to unsigned before doing n %= k. We know this is safe because neither value can be negative. libstdc++-v3/ChangeLog: PR libstdc++/113811 * include/bits/stl_algo.h (__rotate): Use unsigned values for division.
This commit is contained in:
parent
b58f0e5216
commit
4d819db7f2
|
@ -1251,6 +1251,12 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
|
||||||
typedef typename iterator_traits<_RandomAccessIterator>::value_type
|
typedef typename iterator_traits<_RandomAccessIterator>::value_type
|
||||||
_ValueType;
|
_ValueType;
|
||||||
|
|
||||||
|
#if __cplusplus >= 201103L
|
||||||
|
typedef typename make_unsigned<_Distance>::type _UDistance;
|
||||||
|
#else
|
||||||
|
typedef _Distance _UDistance;
|
||||||
|
#endif
|
||||||
|
|
||||||
_Distance __n = __last - __first;
|
_Distance __n = __last - __first;
|
||||||
_Distance __k = __middle - __first;
|
_Distance __k = __middle - __first;
|
||||||
|
|
||||||
|
@ -1281,7 +1287,7 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
|
||||||
++__p;
|
++__p;
|
||||||
++__q;
|
++__q;
|
||||||
}
|
}
|
||||||
__n %= __k;
|
__n = static_cast<_UDistance>(__n) % static_cast<_UDistance>(__k);
|
||||||
if (__n == 0)
|
if (__n == 0)
|
||||||
return __ret;
|
return __ret;
|
||||||
std::swap(__n, __k);
|
std::swap(__n, __k);
|
||||||
|
@ -1305,7 +1311,7 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
|
||||||
--__q;
|
--__q;
|
||||||
std::iter_swap(__p, __q);
|
std::iter_swap(__p, __q);
|
||||||
}
|
}
|
||||||
__n %= __k;
|
__n = static_cast<_UDistance>(__n) % static_cast<_UDistance>(__k);
|
||||||
if (__n == 0)
|
if (__n == 0)
|
||||||
return __ret;
|
return __ret;
|
||||||
std::swap(__n, __k);
|
std::swap(__n, __k);
|
||||||
|
|
Loading…
Reference in New Issue