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

Hum*_*awi 5 c++ arrays smart-pointers c++11

我遇到过类似的东西:

using arr_t=std::array<std::array<std::array<int,1000>,1000>,1000>;
std::unique_ptr<arr_t> u_ptr;
Run Code Online (Sandbox Code Playgroud)

显然,使用唯一指针来克服stackoverflow问题.有没有使用以前的代码而不仅仅是使用std::vector?有真正的用例std::unique_ptr<std::array<T,N>>吗?

Yak*_*ont 8

上面的代码生成一个十亿个元素的连续缓冲区,通过[]访问可以将元素作为三维1000边的多维数据集.

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

我怀疑你在暗示

using u_ptr=std::vector<std::array<std::array<int,1000>,1000>>;
Run Code Online (Sandbox Code Playgroud)

然后调整表示arr_t1000创建一次.这在handle对象中有额外的2指针开销的适度成本.它还允许变化的大小,这意味着确保它是固定大小的,这是用户代码必须确保的.你想要阻止一堆方法,基本上一切unique_ptr都没有公开,以确保安全,或审计你的代码不使用任何方法.

其中一些操作可能非常昂贵; .push_back({})会重新分配一个千兆字节.

现在,也许你打算不会打电话给那个; 但是如果你有处理向量的通用代码,你必须审核所有这些代码以确保它们都不会执行这些操作.对于vector无法调整大小的非const句柄是不可能的,例如,此时不使用roll-your-own-span类.

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