- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这与其说是性能问题,不如说是样式问题。我刚刚将(大部分)指针转换为 shared_ptr 对象,并且不情愿地接受 weak_ptr 作为原始指针的替代品。我的问题是,遍历共享指针对象序列(比方说 vector )的首选方法是什么?这是我一直在做的事情:
std::vector<std::shared_ptr<A>> my_sequence;
// Do something to fill my_sequence;
for (std::shared_ptr<A> const& ptr : my_sequence)
{
ptr->AMethod();
}
虽然这违背了*不要使用 shared_ptr 引用*规则,那么什么是好的替代方案,为什么?
我会问的问题是;该技术是否可靠,即。对于超小的 AMethod() 和超大的 my_sequence,由于 shared_ptr 拷贝,此方法是否会开始不必要地阻碍性能?它可读吗?简单吗?
最佳答案
首先声明一下:
shared_ptr
不是 Elixir 。它应该在所有权实际共享时使用。非共享所有权用unique_ptr
表示非所有权由(原始)引用表示。 weak_ptr
用于 shared_ptr
必须观察但不能拥有……但通常不是针对过时指针的良好防御实践。默认为 shared_ptr
直接进入最低公分母;这是糟糕的编程习惯。
这里的选择在shared_ptr< T >
之间, shared_ptr< T const >
, shared_ptr< T > const &
, 和 T const &
, 和 T &
.假设您没有更改任何内容,但序列可以 更改其对象,因此 const
是可取的。这将它缩小到 shared_ptr< T const >
, shared_ptr< T > const &
, 和 T const &
.
让我们将问题重新表述为,
Is
shared_ptr< T > const &
ever the right choice?
据此,评估备选方案。
shared_ptr< T const >
(按值传递共享指针)
shared_ptr< T >
move
d 扩大所有权池const
被调用函数的正确性 shared_ptr< T > const &
(通过引用传递共享指针)
–: 输 const
调用函数的正确性
shared_ptr< T const > const &
相反,您将传递一个临时拷贝,并以这种替代方法和按值传递的缺点而告终。–:通过额外的间接访问对象
T const &
(直接引用)
const
正确性权衡一下,如果没有扩展所有权(例如通过返回一个保留参数的对象),您确实应该传递一个简单的引用。在这种情况下,函数应该很少关心它的参数是如何拥有的。拥有它需要 shared_ptr
以最糟糕的方式违反关注点分离。您不能在拥有本地对象或成员子对象的情况下仍然使用该函数。最糟糕的是,一切都变得更加复杂。
如果所有权可能扩展到其他人,这将是使用 shared_ptr
的理由首先,那么你应该总是路过shared_ptr< [const] T >
值(value)。是的,它确实复制了 shared_ptr
随叫随到。但是复制 shared_ptr
的昂贵部分正在更新引用计数,而不是将指针压入堆栈。如果您要授予所有权,您无论如何都想更新引用计数。取传递的值和move
它不触及引用计数。这样做之后,传递引用将没有任何优势,而且还有很多劣势。
关于c++ - 如何遍历一系列 shared_ptr 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17286827/
我是一名优秀的程序员,十分优秀!