与 C++11 中的普通指针相比,智能指针的开销是多少?换句话说,如果我使用智能指针,我的代码会变慢吗?如果是,会慢多少?
具体来说,我问的是 C++11 std::shared_ptr
和 std::unique_ptr
。
很明显,压入堆栈的东西会更大(至少我是这么认为的),因为智能指针还需要存储其内部状态(引用计数等),问题真的是,如果有的话,这会对我的表现产生多大的影响?
例如,我从函数返回智能指针而不是普通指针:
std::shared_ptr<const Value> getValue();
// versus
const Value *getValue();
或者,例如,当我的一个函数接受智能指针而不是普通指针作为参数时:
void setValue(std::shared_ptr<const Value> val);
// versus
void setValue(const Value *val);
最佳答案
std::unique_ptr
只有在你为它提供一些重要的删除器时才会有内存开销。
std::shared_ptr
总是有引用计数器的内存开销,尽管它非常小。
std::unique_ptr
仅在构造函数期间(如果它必须复制提供的删除器和/或空初始化指针)和析构函数期间(销毁拥有的对象)有时间开销。
std::shared_ptr
在构造函数(创建引用计数器)、析构函数(减少引用计数器并可能销毁对象)和赋值运算符(增加引用)中有时间开销柜台)。由于 std::shared_ptr
的线程安全保证,这些递增/递减是原子的,因此会增加一些开销。
请注意,它们在取消引用(获取对拥有对象的引用)时都没有时间开销,而此操作似乎是指针最常见的操作。
总而言之,有一些开销,但它不应该让代码变慢,除非你不断地创建和销毁智能指针。
关于c++ - 与 C++ 中的普通指针相比,智能指针的开销是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22295665/