为什么 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::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
成员函数。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- 为什么 std::shared_ptr 被认为是"heavy"和"expensive",但 std::array "same perfprmance as plain (c-style) arrays
- OMNeT++ cPacket as std::bitset 以应用 Reed-Solomon 编码
- 当调用时,为什么ranges ::累积的init as std :: Move(init)
- 如何使用 std::vector<std::tuple<A,B>> 来管理内存(调整大小、保留,...),但实际上将 As 保留在 B 之前,连续
- Pass std::max_element() or std::min_element() to function as
- std::string & as 模板参数和 gcc 5 中的abi_tag
- 简单的模板化函数,用于转换 std::vectors - "illegal use of this type as an expression"
- std::deque memory-address as array