How much is the overhead of smart pointers compared to normal pointers in C++11? In other words, is my code going to be slower if I use smart pointers, and if so, how much slower?
Specifically, I'm asking about the C++11 std::shared_ptr
and std::unique_ptr
.
Obviously, the stuff pushed down the stack is going to be larger (at least I think so), because a smart pointer also needs to store its internal state (reference count, etc), the question really is, how much is this going to affect my performance, if at all?
For example, I return a smart pointer from a function instead of a normal pointer:
std::shared_ptr<const Value> getValue();
// versus
const Value *getValue();
Or, for example, when one of my functions accept a smart pointer as parameter instead of a normal pointer:
void setValue(std::shared_ptr<const Value> val);
// versus
void setValue(const Value *val);
std::unique_ptr
has memory overhead only if you provide it with some non-trivial deleter.
std::shared_ptr
always has memory overhead for reference counter, though it is very small.
std::unique_ptr
has time overhead only during constructor (if it has to copy the provided deleter and/or null-initialize the pointer) and during destructor (to destroy the owned object).
std::shared_ptr
has time overhead in constructor (to create the reference counter), in destructor (to decrement the reference counter and possibly destroy the object) and in assignment operator (to increment the reference counter). Due to thread-safety guarantees of std::shared_ptr
, these increments/decrements are atomic, thus adding some more overhead.
Note that none of them has time overhead in dereferencing (in getting the reference to owned object), while this operation seems to be the most common for pointers.
To sum up, there is some overhead, but it shouldn't make the code slow unless you continuously create and destroy smart pointers.