[committed] libstdc++: Add noexcept to std::to_string overloads that don't allocate
Commit Message
When the values is guaranteed to fit in the SSO buffer we know the
string won't allocate, so the function can be noexcept. For 32-bit
integers, we know they need no more than 9 bytes (or 10 with a minus
sign) and the SSO buffer is 15 bytes.
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:
* include/bits/basic_string.h [_GLIBCXX_USE_CXX11_ABI]
(to_string): Add noexcept if the type width is 32 bits or less.
Tested x86_64-linux. Committed to trunk.
commit 9d813ddd978aff75001d53fe55ff15e9167bb4d0
Author: Jonathan Wakely <jwakely@redhat.com>
Date: Wed Sep 15 21:40:20 2021
libstdc++: Add noexcept to std::to_string overloads that don't allocate
When the values is guaranteed to fit in the SSO buffer we know the
string won't allocate, so the function can be noexcept. For 32-bit
integers, we know they need no more than 9 bytes (or 10 with a minus
sign) and the SSO buffer is 15 bytes.
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:
* include/bits/basic_string.h [_GLIBCXX_USE_CXX11_ABI]
(to_string): Add noexcept if the type width is 32 bits or less.
@@ -3718,6 +3718,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
inline string
to_string(int __val)
+#if _GLIBCXX_USE_CXX11_ABI && (__CHAR_BIT__ * __SIZEOF_INT__) <= 32
+ noexcept // any 32-bit value fits in the SSO buffer
+#endif
{
const bool __neg = __val < 0;
const unsigned __uval = __neg ? (unsigned)~__val + 1u : __val;
@@ -3729,6 +3732,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
inline string
to_string(unsigned __val)
+#if _GLIBCXX_USE_CXX11_ABI && (__CHAR_BIT__ * __SIZEOF_INT__) <= 32
+ noexcept // any 32-bit value fits in the SSO buffer
+#endif
{
string __str(__detail::__to_chars_len(__val), '\0');
__detail::__to_chars_10_impl(&__str[0], __str.size(), __val);
@@ -3737,6 +3743,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
inline string
to_string(long __val)
+#if _GLIBCXX_USE_CXX11_ABI && (__CHAR_BIT__ * __SIZEOF_LONG__) <= 32
+ noexcept // any 32-bit value fits in the SSO buffer
+#endif
{
const bool __neg = __val < 0;
const unsigned long __uval = __neg ? (unsigned long)~__val + 1ul : __val;
@@ -3748,6 +3757,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
inline string
to_string(unsigned long __val)
+#if _GLIBCXX_USE_CXX11_ABI && (__CHAR_BIT__ * __SIZEOF_LONG__) <= 32
+ noexcept // any 32-bit value fits in the SSO buffer
+#endif
{
string __str(__detail::__to_chars_len(__val), '\0');
__detail::__to_chars_10_impl(&__str[0], __str.size(), __val);