为什么 std::shared_ptr 被认为是"heavy"和"expensive",但 std::array "same perfprmance as plain (c-style) arrays

Why std::shared_ptr considered to be "heavy" and "expensive", but std::array "same perfprmance as plain (c-style) arrays"?

本文关键字:std as perfprmance array same arrays c-style plain expensive ptr shared      更新时间:2023-10-16

我不太明白为什么 std::shared_ptr 被认为是"沉重"和"昂贵"的,而 std::array "与普通(C 样式(数组的性能相同"?与共享 ptr 一样,我们有指针和两个计数器:用于共享引用和弱引用。在 std::array 中,我们有指向数据的指针及其大小(基本上与 shared_ptr 中的指针计数相同(。似乎是相同的开销,尽管到处都写着具有"C 样式数组的性能和可访问性"。

在 std::array 中,我们有指向数据的指针及其大小(基本上与 shared_ptr 中的指针计数相同(。

这是不正确的。std::array基本上是

template <typename T, std::size_t N>
struct array
{
T data[N];
};

没有分配、指针或额外的大小变量。 它只是包装一个原始数组并提供函数来使其成为容器。

另一方面,std::shared_ptr持有指针,并且需要动态分配指向的对象。 它还需要引用计数,并且需要以线程安全的方式完成,这会带来大量开销。

这就是为什么array是"零成本抽象"而shared_ptr不是。

在 std::array 中,我们有指向数据的指针及其大小

std::array不需要将其大小存储在任何地方,更不用说将其存储在每个对象中了。对于给定类型,std::array::size()的值在编译时是已知的。(不要忘记std::array<int, 2>std::array<int, 3>是不同的类型。

template < class T, std::size_t N >
constexpr std::size_t std::array<T,N>::size()
{
return N;
}

这是一种可能的实现。它可以成为static成员函数。