From e8f5d9f8ef8728bafce71e241aa4c1a5c5a768da Mon Sep 17 00:00:00 2001 From: "Philipp A. Hartmann" Date: Thu, 30 Oct 2014 18:40:58 +0100 Subject: [PATCH] MemoryPoolAllocator, Stack: lazily allocate Allocators In order to make the constructors more efficient, especially in the context of C++11 move semantics, the (dynamic) allocations in MemoryPoolAllocator and Stack should be performed lazily. Move the allocations to the first use of the allocator in both classes. --- include/rapidjson/allocators.h | 5 ++--- include/rapidjson/internal/stack.h | 8 ++++---- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/include/rapidjson/allocators.h b/include/rapidjson/allocators.h index 04fab68..0d7b664 100644 --- a/include/rapidjson/allocators.h +++ b/include/rapidjson/allocators.h @@ -104,9 +104,6 @@ public: MemoryPoolAllocator(size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) : chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(0), baseAllocator_(baseAllocator), ownBaseAllocator_(0) { - if (!baseAllocator_) - ownBaseAllocator_ = baseAllocator_ = RAPIDJSON_NEW(BaseAllocator()); - AddChunk(chunk_capacity_); } //! Constructor with user-supplied buffer. @@ -216,6 +213,8 @@ private: /*! \param capacity Capacity of the chunk in bytes. */ void AddChunk(size_t capacity) { + if (!baseAllocator_) + ownBaseAllocator_ = baseAllocator_ = RAPIDJSON_NEW(BaseAllocator()); ChunkHeader* chunk = reinterpret_cast(baseAllocator_->Malloc(sizeof(ChunkHeader) + capacity)); chunk->capacity = capacity; chunk->size = 0; diff --git a/include/rapidjson/internal/stack.h b/include/rapidjson/internal/stack.h index 24ad4bc..b7d7449 100644 --- a/include/rapidjson/internal/stack.h +++ b/include/rapidjson/internal/stack.h @@ -37,8 +37,6 @@ public: // Do it lazily when first Push() -> Expand() -> Resize(). Stack(Allocator* allocator, size_t stackCapacity) : allocator_(allocator), ownAllocator_(0), stack_(0), stackTop_(0), stackEnd_(0), initialCapacity_(stackCapacity) { RAPIDJSON_ASSERT(stackCapacity > 0); - if (!allocator_) - ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator()); } #if RAPIDJSON_HAS_CXX11_RVALUE_REFS @@ -140,9 +138,11 @@ private: void Expand(size_t count) { // Only expand the capacity if the current stack exists. Otherwise just create a stack with initial capacity. size_t newCapacity; - if (stack_ == 0) + if (stack_ == 0) { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator()); newCapacity = initialCapacity_; - else { + } else { newCapacity = GetCapacity(); newCapacity += (newCapacity + 1) / 2; }