diff options
author | Pádraig Brady <pbrady@fb.com> | 2019-05-20 11:15:03 +0000 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2019-05-20 12:15:03 +0100 |
commit | e5178b986a66848440fbb076287c5a0f87d86c6f (patch) | |
tree | 294d66da4291c695a3645943287540ae1b32fa68 | |
parent | eb530cab9a02ab8f223883422f74f4f3a4b24c64 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | libstdc++-v3/include/ext/new_allocator.h | 14 |
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 |