c++ - 与 C++ 中的普通指针相比,智能指针的开销是多少?

标签 c++ performance c++11 smart-pointers

与 C++11 中的普通指针相比,智能指针的开销是多少?换句话说,如果我使用智能指针,我的代码会变慢吗?如果是,会慢多少?

具体来说,我问的是 C++11 std::shared_ptrstd::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/

相关文章:

c++ - 未排序长度 n 数组中 k 个最大元素的索引

c++ - 更大类的单个方法的部分模板特化

c++ - 为什么 std::u16cout 不见了?

c++ - 如何从 dbx 获得尽可能多的信息

c++ - 如何模拟 Google Test 中公共(public)方法正在使用的类中的私有(private)方法?

c# - 将旧版 .NET 集合迁移到其通用对应集合

postgresql - Postgresql 的性能报告

django - Django 中信号的性能

c++ - unique_ptr 与 vector : error: call to implicitly-deleted copy constructor of XXX

c++ - 如何包含 uniform_real_distribution 的最大值