aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPádraig Brady <pbrady@fb.com>2019-05-20 11:15:03 +0000
committerJonathan Wakely <redi@gcc.gnu.org>2019-05-20 12:15:03 +0100
commite5178b986a66848440fbb076287c5a0f87d86c6f (patch)
tree294d66da4291c695a3645943287540ae1b32fa68
parenteb530cab9a02ab8f223883422f74f4f3a4b24c64 (diff)
downloadgcc-e5178b986a66848440fbb076287c5a0f87d86c6f.zip
gcc-e5178b986a66848440fbb076287c5a0f87d86c6f.tar.gz
gcc-e5178b986a66848440fbb076287c5a0f87d86c6f.tar.bz2
std::allocator::deallocate support sized-deallocation
Pass the size to the allocator so that it may optimize deallocation. This was seen to significantly reduce the work required in jemalloc, with about 40% reduction in CPU cycles in the free path. Note jemalloc >= 5.2 is required to fix a crash with 0 sizes. 2019-05-20 Pádraig Brady <pbrady@fb.com> * libstdc++-v3/include/ext/new_allocator.h (deallocate): Pass the size to the deallocator with -fsized-deallocation. From-SVN: r271409
-rw-r--r--libstdc++-v3/ChangeLog5
-rw-r--r--libstdc++-v3/include/ext/new_allocator.h14
2 files changed, 16 insertions, 3 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 0b07d0e..74717de 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,8 @@
+2019-05-20 Pádraig Brady <pbrady@fb.com>
+
+ * libstdc++-v3/include/ext/new_allocator.h (deallocate): Pass the size
+ to the deallocator with -fsized-deallocation.
+
2019-05-20 Jonathan Wakely <jwakely@redhat.com>
* testsuite/experimental/memory_resource/new_delete_resource.cc: Fix
diff --git a/libstdc++-v3/include/ext/new_allocator.h b/libstdc++-v3/include/ext/new_allocator.h
index e245391..f1ff7da 100644
--- a/libstdc++-v3/include/ext/new_allocator.h
+++ b/libstdc++-v3/include/ext/new_allocator.h
@@ -116,16 +116,24 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// __p is not permitted to be a null pointer.
void
- deallocate(pointer __p, size_type)
+ deallocate(pointer __p, size_type __t)
{
#if __cpp_aligned_new
if (alignof(_Tp) > __STDCPP_DEFAULT_NEW_ALIGNMENT__)
{
- ::operator delete(__p, std::align_val_t(alignof(_Tp)));
+ ::operator delete(__p,
+# if __cpp_sized_deallocation
+ __t * sizeof(_Tp),
+# endif
+ std::align_val_t(alignof(_Tp)));
return;
}
#endif
- ::operator delete(__p);
+ ::operator delete(__p
+#if __cpp_sized_deallocation
+ , __t * sizeof(_Tp)
+#endif
+ );
}
size_type