Skip to content

Commit e04d124

Browse files
authored
[libc++] Call basic_string_view's assume-valid constructor from basic_string operations (#105863)
`basic_string` frequently calls `basic_string_view(data(), size())`, which accounts for ~15% of the observed overhead when hardening is enabled. This commit removes unnecessary checks when `basic_string` is known to already have valid data, by bypassing the public constructor, so that we eliminate that overhead.
1 parent ee737c3 commit e04d124

File tree

2 files changed

+10
-6
lines changed

2 files changed

+10
-6
lines changed

libcxx/include/string

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1213,7 +1213,7 @@ public:
12131213
}
12141214

12151215
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 operator __self_view() const _NOEXCEPT {
1216-
return __self_view(data(), size());
1216+
return __self_view(typename __self_view::__assume_valid(), data(), size());
12171217
}
12181218

12191219
_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_STRING_INTERNAL_MEMORY_ACCESS basic_string&
@@ -1822,7 +1822,7 @@ public:
18221822

18231823
#if _LIBCPP_STD_VER >= 20
18241824
constexpr _LIBCPP_HIDE_FROM_ABI bool starts_with(__self_view __sv) const noexcept {
1825-
return __self_view(data(), size()).starts_with(__sv);
1825+
return __self_view(typename __self_view::__assume_valid(), data(), size()).starts_with(__sv);
18261826
}
18271827

18281828
constexpr _LIBCPP_HIDE_FROM_ABI bool starts_with(value_type __c) const noexcept {
@@ -1834,7 +1834,7 @@ public:
18341834
}
18351835

18361836
constexpr _LIBCPP_HIDE_FROM_ABI bool ends_with(__self_view __sv) const noexcept {
1837-
return __self_view(data(), size()).ends_with(__sv);
1837+
return __self_view(typename __self_view::__assume_valid(), data(), size()).ends_with(__sv);
18381838
}
18391839

18401840
constexpr _LIBCPP_HIDE_FROM_ABI bool ends_with(value_type __c) const noexcept {
@@ -1848,15 +1848,15 @@ public:
18481848

18491849
#if _LIBCPP_STD_VER >= 23
18501850
constexpr _LIBCPP_HIDE_FROM_ABI bool contains(__self_view __sv) const noexcept {
1851-
return __self_view(data(), size()).contains(__sv);
1851+
return __self_view(typename __self_view::__assume_valid(), data(), size()).contains(__sv);
18521852
}
18531853

18541854
constexpr _LIBCPP_HIDE_FROM_ABI bool contains(value_type __c) const noexcept {
1855-
return __self_view(data(), size()).contains(__c);
1855+
return __self_view(typename __self_view::__assume_valid(), data(), size()).contains(__c);
18561856
}
18571857

18581858
constexpr _LIBCPP_HIDE_FROM_ABI bool contains(const value_type* __s) const {
1859-
return __self_view(data(), size()).contains(__s);
1859+
return __self_view(typename __self_view::__assume_valid(), data(), size()).contains(__s);
18601860
}
18611861
#endif
18621862

libcxx/include/string_view

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ namespace std {
211211
#include <__functional/hash.h>
212212
#include <__functional/unary_function.h>
213213
#include <__fwd/ostream.h>
214+
#include <__fwd/string.h>
214215
#include <__fwd/string_view.h>
215216
#include <__iterator/bounded_iter.h>
216217
#include <__iterator/concepts.h>
@@ -689,6 +690,9 @@ private:
689690

690691
const value_type* __data_;
691692
size_type __size_;
693+
694+
template <class, class, class>
695+
friend class basic_string;
692696
};
693697
_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(basic_string_view);
694698

0 commit comments

Comments
 (0)