2017-05-03 34 views
4

我碰到的东西来了,如同:是否有一个用例的std ::的unique_ptr <性病::阵列<T,N>>

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

独特的指针使用,显然,克服计算器问题。是否有任何情况下使用以前的代码,而不仅仅是使用std::vector?是否有真正的用例std::unique_ptr<std::array<T,N>>

+3

您可以确定'arr_t'永远不会调整大小。优化可能会发现有用。 –

+0

非常相关,可能dupe:https://stackoverflow.com/questions/19111028/stddynarray-vs-stdvector – nwp

+2

可能重复[std :: dynarray vs std :: vector](http://stackoverflow.com/questions/19111028/stddynarray -vs-stdvector) –

回答

7

上面的代码生成了一个亿个元素的连续缓冲区,其中[]访问使您可以将元素作为3维1000面的多维数据集。

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

我怀疑你的建议

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

然后调整说arr_t1000创建一次。这在处理对象中具有额外的2个指针开销的适度成本。它也允许可变大小,这意味着确保它的大小是固定的,这是用户代码必须确保的。你想一堆方法,基本上所有的东西unique_ptr不公开,以确保安全,或审计你的代码没有使用任何他们。

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

现在,也许你打算永远不会打电话给你;但是如果你有处理向量的通用代码,你必须审计所有的以确保它们都不会执行这些操作。对于无法调整大小的vector而言,不可能有非常量句柄,例如,此时不滚动您自己的span级别。

我们可以通过私有继承和using声明来阻止我们不想公开的方法,但是现在我们最终完成了大部分工作以回到unique_ptr解决方案。

+0

那么,你可以有一个很薄的类,它包含*一个私有的'std :: vector',并且转发所有相关的方法 - 甚至可以使它的大小模板化,比如'std :: array'。如果你做得很好,审计它也不会太难。 *从'std :: array'继承*当然是一个糟糕的想法,同意。 –

+0

@TobySpeight不,我的意思是从'std :: vector'私下继承,然后'使用向量 ::运算符[]'和'使用向量 :: size'要重新导出的接口。私有继承涉及的样板要少得多(并且可能会出现拼写错误),而当您试图将其他类的接口的某些部分重新导出时,私有继承的含义要少得多。 – Yakk

+0

我没有考虑私人继承,但这是有道理的。我被“阻塞”方法的讨论误导了,而不是选择发布哪些方法。 –

相关问题