What does "single allocation" mean for boost::make_shared
In the boost doc of make_shared, it says:
Besides convenience and style, 开发者_高级运维such a function is also exception safe and considerably faster because it can use a single allocation for both the object and its corresponding control block, eliminating a significant portion of shared_ptr's construction overhead.
I don't understand the meaning of "single allocation", what does it mean?
An "allocation" means a block of memory obtained from a call to an allocator.
Usually, creating a shared_ptr
with the pointer constructor allocates memory for a "control block", which holds the reference count and the deleter. Copies of that shared_ptr
all refer to the same control block, so that they share the reference count. Hence there are two allocations in total - the object itself and the control block created by shared_ptr
.
If you create the object and shared_ptr
together with make_shared
, then only one allocation is made. You can think of this as a single struct with two members:
- The object which is being managed
- The control block.
The shared_ptr
needs to allocate space for the reference count. This means that you will dynamically create your object (one allocation) and pass it to the shared_ptr
that will in turn allocate the count (second allocation). make_shared
performs a single allocation of a big enough size and then constructs in place both the count and the object.
精彩评论