From fa994d0377ddc7a10b760a5bde75239d76b7f1e7 Mon Sep 17 00:00:00 2001 From: Billy Donahue Date: Wed, 17 May 2023 07:57:56 +0000 Subject: SERVER-76788 elide trivial Decoration constructors --- src/mongo/util/decoration_container.h | 2 +- src/mongo/util/decoration_registry.h | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/mongo/util/decoration_container.h b/src/mongo/util/decoration_container.h index 4b2f7bf0619..67a76730a16 100644 --- a/src/mongo/util/decoration_container.h +++ b/src/mongo/util/decoration_container.h @@ -97,7 +97,7 @@ public: explicit DecorationContainer(Decorable* const decorated, const DecorationRegistry* const registry) : _registry(registry), - _decorationData(new unsigned char[registry->getDecorationBufferSizeBytes()]) { + _decorationData(new unsigned char[registry->getDecorationBufferSizeBytes()]{}) { // Because the decorations live in the externally allocated storage buffer at // `_decorationData`, there needs to be a way to get back from a known location within this // buffer to the type which owns those decorations. We place a pointer to ourselves, a diff --git a/src/mongo/util/decoration_registry.h b/src/mongo/util/decoration_registry.h index 4720d5fc9ed..5bac5979830 100644 --- a/src/mongo/util/decoration_registry.h +++ b/src/mongo/util/decoration_registry.h @@ -71,7 +71,7 @@ public: typename DecorationContainer::template DecorationDescriptorWithType( std::move(declareDecoration(sizeof(T), std::alignment_of::value, - &constructAt, + getConstructorFn(), nullptr, nullptr, getDestructorFn()))); @@ -93,7 +93,7 @@ public: typename DecorationContainer::template DecorationDescriptorWithType( std::move(declareDecoration(sizeof(T), std::alignment_of::value, - &constructAt, + getConstructorFn(), ©ConstructAt, ©AssignAt, getDestructorFn()))); @@ -131,6 +131,8 @@ public: using std::cend; for (; iter != cend(_decorationInfo); ++iter) { + if (!iter->constructor) + continue; iter->constructor(container->getDecoration(iter->descriptor)); } @@ -270,6 +272,14 @@ private: static_cast(location)->~T(); } + template + static constexpr DecorationConstructorFn getConstructorFn() { + if constexpr (std::is_trivially_constructible_v) + return nullptr; + else + return &constructAt; + } + template static constexpr DecorationDestructorFn getDestructorFn() { if constexpr (std::is_trivially_destructible_v) -- cgit v1.2.1