std::unique_ptr<std::array<T,N>> 是否有用例

Is there a use case for std::unique_ptr<std::array<T,N>>

我遇到了类似的事情:

using arr_t=std::array<std::array<std::array<int,1000>,1000>,1000>;
std::unique_ptr<arr_t> u_ptr;

显然,使用了唯一指针来克服计算器溢出问题。是否有任何情况可以使用以前的代码而不仅仅是使用 std::vectorstd::unique_ptr<std::array<T,N>> 有实际用例吗?

上面的代码生成一个包含 10 亿个元素的连续缓冲区,通过 [] 访问,您可以将元素作为 3 维 1000 面立方体获取。

向量的向量将是一整堆由指针和所有权语义链接的非连续缓冲区。

我怀疑你在暗示

using u_ptr=std::vector<std::array<std::array<int,1000>,1000>>;

然后在创建后将 arr_t 调整为 1000。这在句柄对象中具有额外的 2 个指针开销的适度成本。它还允许可变大小,这意味着确保它是预期的固定大小是用户代码必须确保的。您想要 阻止 一堆方法,基本上所有 unique_ptr 都不会公开,以确保安全,或审核您的代码不使用其中任何一个。

其中一些操作可能非常昂贵; .push_back({}) 将重新分配 1 GB。

现在,也许您打算永远不会调用它;但是,如果您有处理向量的通用代码,则必须审核它的 所有 以确保其中的 none 都执行这些操作。不可能有一个无法调整其大小的 vector 的非常量句柄,例如,此时不滚动您自己的跨度-class。

我们可以用私有继承和 using 语句来阻止我们不想公开的方法,但此时我们最终完成了大部分工作以回到 unique_ptr 解决方案.