所以,我有一个问题,但我找不到答案。在C++中,共享指针有一个可以包含原始数组的构造函数(例如std::shared_ptr<int[]>)。与std::array或std::vector相比,使用它有什么好处?试着搜索,问GPT。至于std::vector,有人建议使用std::shared_ptr可以避免内存分配,但这并不能解释为什么在有std::数组的情况下使用它
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<??>一样。
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::shared_ptr<T[]>
std::shared_ptr<??>
9nvpjoqh2#
容器和智能指针的使用取决于使用和设计:
std::vector creates a dynamic array of objects on heapstd::array creates a static array of object on stack, size known at compile timestd::shared_ptr<int[]> keeps the reference count of the resource, here resource is a pointer to an array
std::vector creates a dynamic array of objects on heap
std::array creates a static array of object on stack, size known at compile time
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,这可以优化分配的数量。
2条答案
按热度按时间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<??>
一样。9nvpjoqh2#
容器和智能指针的使用取决于使用和设计:
std::array在堆栈上,如果使用限制在一个范围内,并且在编译时已知大小,则可以使用array。
当你想在函数、容器、线程(多线程安全对象或const)之间共享资源的所有权时,shared_ptr是合适的。但是使用shared_ptr并不意味着我们可以避免分配,你需要传递它管理的资源指针。
至于vector,它在堆上分配数据,但需要注意vector本身不应该超出范围,否则析构函数将释放资源,因为它没有像shared_pointer那样的引用计数。
如果使用vector,则至少完成一次分配。
如果你使用数组,它在堆栈上,所以没有分配。
shared_ptr接受一个指针,它必须被分配到某个地方。其它分配是控制块的分配。因此,使用2个分配直到std::make_shared,这可以优化分配的数量。