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
1 changed files with 8 additions and 2 deletions
|
@ -1251,6 +1251,12 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
|
|||
typedef typename iterator_traits<_RandomAccessIterator>::value_type
|
||||
_ValueType;
|
||||
|
||||
#if __cplusplus >= 201103L
|
||||
typedef typename make_unsigned<_Distance>::type _UDistance;
|
||||
#else
|
||||
typedef _Distance _UDistance;
|
||||
#endif
|
||||
|
||||
_Distance __n = __last - __first;
|
||||
_Distance __k = __middle - __first;
|
||||
|
||||
|
@ -1281,7 +1287,7 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
|
|||
++__p;
|
||||
++__q;
|
||||
}
|
||||
__n %= __k;
|
||||
__n = static_cast<_UDistance>(__n) % static_cast<_UDistance>(__k);
|
||||
if (__n == 0)
|
||||
return __ret;
|
||||
std::swap(__n, __k);
|
||||
|
@ -1305,7 +1311,7 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
|
|||
--__q;
|
||||
std::iter_swap(__p, __q);
|
||||
}
|
||||
__n %= __k;
|
||||
__n = static_cast<_UDistance>(__n) % static_cast<_UDistance>(__k);
|
||||
if (__n == 0)
|
||||
return __ret;
|
||||
std::swap(__n, __k);
|
||||
|
|
Loading…
Add table
Reference in a new issue