c++ std::shared_ptr&lt;T[]&gt; VS std::array&lt;T,size&gt;/std::vector< T>

nfeuvbwi  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(191)

所以,我有一个问题,但我找不到答案。在C++中,共享指针有一个可以包含原始数组的构造函数(例如std::shared_ptr<int[]>)。
与std::array或std::vector相比,使用它有什么好处?
试着搜索,问GPT。至于std::vector,有人建议使用std::shared_ptr可以避免内存分配,但这并不能解释为什么在有std::数组的情况下使用它

qrjkbowd

qrjkbowd1#

与所有其他列出的选项不同,std::array要求在编译时知道大小,并且不将元素存储在堆上(除非它本身在堆上)。
std::vector<T>可以使用编译时未知的大小,在这种情况下应该是默认选择。它总是将元素存储在堆上。
std::unique_ptr<T[]>可以被认为是剥离的std::vector。它不知道它的大小,这节省了一点内存(sizeof(std::unique_ptr<T[]>)通常是sizeof(void *),而sizeof(std::vector<T>)通常是3 * sizeof(void *))。
因为它不存储自己的大小,所以它能做的事情很少:它不能被复制(只能移动),不能插入或删除元素,等等。如果您单独存储大小,您可以手动完成所有这些操作,但这样做只是std::vector和额外的步骤。
std::shared_ptr<T[]>std::unique_ptr<T[]>增加了一个额外的特性-共享所有权,就像任何其他std::shared_ptr<??>一样。

9nvpjoqh

9nvpjoqh2#

容器和智能指针的使用取决于使用和设计:

  1. std::vector creates a dynamic array of objects on heap
  2. std::array creates a static array of object on stack, size known at compile time
  3. std::shared_ptr<int[]> keeps the reference count of the resource, here resource is a pointer to an array

std::array在堆栈上,如果使用限制在一个范围内,并且在编译时已知大小,则可以使用array。
当你想在函数、容器、线程(多线程安全对象或const)之间共享资源的所有权时,shared_ptr是合适的。但是使用shared_ptr并不意味着我们可以避免分配,你需要传递它管理的资源指针。
至于vector,它在堆上分配数据,但需要注意vector本身不应该超出范围,否则析构函数将释放资源,因为它没有像shared_pointer那样的引用计数。
如果使用vector,则至少完成一次分配。
如果你使用数组,它在堆栈上,所以没有分配。
shared_ptr接受一个指针,它必须被分配到某个地方。其它分配是控制块的分配。因此,使用2个分配直到std::make_shared,这可以优化分配的数量。

相关问题