[libcxx-commits] [libcxx] [libc++] Base string's alignment on __STDCPP_DEFAULT_NEW_ALIGNMENT__ (PR #171785)
Nikolas Klauser via libcxx-commits
libcxx-commits at lists.llvm.org
Tue Jan 27 05:08:00 PST 2026
https://github.com/philnik777 updated https://github.com/llvm/llvm-project/pull/171785
>From 4fb22f014d9f3c4bcbd7117bdce480e9be5defcf Mon Sep 17 00:00:00 2001
From: Nikolas Klauser <nikolasklauser at berlin.de>
Date: Thu, 11 Dec 2025 10:14:52 +0100
Subject: [PATCH] [libc++] Base string's alignment on
__STDCPP_DEFAULT_NEW_ALIGNMENT__
---
libcxx/include/string | 7 ++++++-
.../basic.string/string.capacity/allocation_size.pass.cpp | 7 +++++--
.../strings/basic.string/string.capacity/max_size.pass.cpp | 7 +++++--
3 files changed, 16 insertions(+), 5 deletions(-)
diff --git a/libcxx/include/string b/libcxx/include/string
index 1ced528135b97..6fdbe175d239e 100644
--- a/libcxx/include/string
+++ b/libcxx/include/string
@@ -2351,7 +2351,12 @@ private:
static _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type __align_it(size_type __s) _NOEXCEPT {
return (__s + (__a - 1)) & ~(__a - 1);
}
- enum { __alignment = 8 };
+
+# ifdef __STDCPP_DEFAULT_NEW_ALIGNMENT__
+ static inline const size_t __alignment = __is_std_allocator_v<allocator_type> ? __STDCPP_DEFAULT_NEW_ALIGNMENT__ : 8;
+# else
+ static inline const size_t __alignment = 8;
+# endif
// This makes sure that we're using a capacity with some extra alignment, since allocators almost always over-align
// the allocations anyways, improving memory usage. More importantly, this ensures that the lowest bit is never set
diff --git a/libcxx/test/libcxx/strings/basic.string/string.capacity/allocation_size.pass.cpp b/libcxx/test/libcxx/strings/basic.string/string.capacity/allocation_size.pass.cpp
index 77da29225957b..367a58897cec0 100644
--- a/libcxx/test/libcxx/strings/basic.string/string.capacity/allocation_size.pass.cpp
+++ b/libcxx/test/libcxx/strings/basic.string/string.capacity/allocation_size.pass.cpp
@@ -15,8 +15,11 @@
#include "test_macros.h"
-// alignment of the string heap buffer is hardcoded to 8
-const std::size_t alignment = 8;
+#ifdef __STDCPP_DEFAULT_NEW_ALIGNMENT__
+static const std::size_t alignment = __STDCPP_DEFAULT_NEW_ALIGNMENT__;
+#else
+static const std::size_t alginment = 8;
+#endif
int main(int, char**) {
std::string input_string;
diff --git a/libcxx/test/libcxx/strings/basic.string/string.capacity/max_size.pass.cpp b/libcxx/test/libcxx/strings/basic.string/string.capacity/max_size.pass.cpp
index 6bfcb5d4bfcd8..ea4520031475b 100644
--- a/libcxx/test/libcxx/strings/basic.string/string.capacity/max_size.pass.cpp
+++ b/libcxx/test/libcxx/strings/basic.string/string.capacity/max_size.pass.cpp
@@ -17,8 +17,11 @@
#include "test_macros.h"
-// alignment of the string heap buffer is hardcoded to 8
-static const std::size_t alignment = 8;
+#ifdef __STDCPP_DEFAULT_NEW_ALIGNMENT__
+static const std::size_t alignment = __STDCPP_DEFAULT_NEW_ALIGNMENT__;
+#else
+static const std::size_t alginment = 8;
+#endif
template <class = int>
TEST_CONSTEXPR_CXX20 void full_size() {
More information about the libcxx-commits
mailing list