File tree Expand file tree Collapse file tree 6 files changed +17
-32
lines changed
libcxx/strings/basic.string/string.capacity
std/strings/basic.string/string.capacity Expand file tree Collapse file tree 6 files changed +17
-32
lines changed Original file line number Diff line number Diff line change @@ -275,11 +275,10 @@ ABI Affecting Changes
275275 results in an ABI break, however in practice we expect uses of ``std::projected `` in ABI-sensitive places to be
276276 extremely rare. Any error resulting from this change should result in a link-time error.
277277
278- - Under the unstable ABI, the internal alignment requirements for heap allocations
279- inside ``std::string `` has decreased from 16 to 8. This saves memory since string requests fewer additional
280- bytes than it did previously. However, this also changes the return value of ``std::string::max_size ``
281- and can cause code compiled against older libc++ versions but linked at runtime to a new version
282- to throw a different exception when attempting allocations that are too large
278+ - The internal alignment requirements for heap allocations inside ``std::string `` has decreased from 16 to 8. This
279+ saves memory since string requests fewer additional bytes than it did previously. However, this also changes the
280+ return value of ``std::string::max_size `` and can cause code compiled against older libc++ versions but linked at
281+ runtime to a new version to throw a different exception when attempting allocations that are too large
283282 (``std::bad_alloc `` vs ``std::length_error ``).
284283
285284- The layout of some range adaptors that use the ``movable-box `` exposition-only type as an implementation
Original file line number Diff line number Diff line change 174174// The implementation moved to the header, but we still export the symbols from
175175// the dylib for backwards compatibility.
176176# define _LIBCPP_ABI_DO_NOT_EXPORT_TO_CHARS_BASE_10
177- // Save memory by providing the allocator more freedom to allocate the most
178- // efficient size class by dropping the alignment requirements for std::string's
179- // pointer from 16 to 8. This changes the output of std::string::max_size,
180- // which makes it ABI breaking
181- # define _LIBCPP_ABI_STRING_8_BYTE_ALIGNMENT
182177# elif _LIBCPP_ABI_VERSION == 1
183178# if !(defined(_LIBCPP_OBJECT_FORMAT_COFF) || defined(_LIBCPP_OBJECT_FORMAT_XCOFF))
184179// Enable compiling copies of now inline methods into the dylib to support
Original file line number Diff line number Diff line change @@ -1937,12 +1937,7 @@ private:
19371937 return (__s + (__a - 1 )) & ~(__a - 1 );
19381938 }
19391939 enum {
1940- __alignment =
1941- #ifdef _LIBCPP_ABI_STRING_8_BYTE_ALIGNMENT
1942- 8
1943- #else
1944- 16
1945- #endif
1940+ __alignment = 8
19461941 };
19471942 static _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type __recommend (size_type __s) _NOEXCEPT {
19481943 if (__s < __min_cap) {
Original file line number Diff line number Diff line change 66//
77// ===----------------------------------------------------------------------===//
88
9+ // XFAIL: stdlib=apple-libc++ && target={{.+}}-apple-macosx{{10.13|10.15|11.0}}
10+
911// <string>
1012
1113// This test demonstrates the smaller allocation sizes when the alignment
1719
1820#include " test_macros.h"
1921
20- // alignment of the string heap buffer is hardcoded to either 16 or 8
21-
22- const std::size_t alignment =
23- #ifdef _LIBCPP_ABI_STRING_8_BYTE_ALIGNMENT
24- 8 ;
25- #else
26- 16 ;
27- #endif
22+ // alignment of the string heap buffer is hardcoded to 8
23+ const std::size_t alignment = 8 ;
2824
2925int main (int , char **) {
3026 std::string input_string;
Original file line number Diff line number Diff line change 1717
1818#include " test_macros.h"
1919
20- // alignment of the string heap buffer is hardcoded to 16
21-
22- static const std::size_t alignment =
23- #ifdef _LIBCPP_ABI_STRING_8_BYTE_ALIGNMENT
24- 8 ;
25- #else
26- 16 ;
27- #endif
20+ // alignment of the string heap buffer is hardcoded to 8
21+ static const std::size_t alignment = 8 ;
2822
2923template <class = int >
3024TEST_CONSTEXPR_CXX20 void full_size () {
Original file line number Diff line number Diff line change 77// ===----------------------------------------------------------------------===//
88
99// UNSUPPORTED: no-exceptions
10+
11+ // After changing the alignment of the allocated pointer from 16 to 8, the exception thrown is no longer `bad_alloc`
12+ // but instead length_error on systems using new headers but older dylibs.
13+ //
14+ // XFAIL: stdlib=apple-libc++ && target={{.+}}-apple-macosx{{10.13|10.15|11.0}}
15+
1016// <string>
1117
1218// size_type max_size() const; // constexpr since C++20
You canβt perform that action at this time.
0 commit comments