是否有std :: unique_ptr <std :: array <t,n>&gt;的用例

时间:2017-05-03 13:03:38

标签: c++ arrays c++11 smart-pointers

我遇到过类似的事情:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<fieldset>
0 - dont Count
</fieldset>
<fieldset class="active">
1 - count me
</fieldset>
<fieldset class="percent">
2 - count me
</fieldset>
<fieldset class="percent">
3 - count me
</fieldset>
<fieldset class="percent">
4 - count me
</fieldset>
<fieldset>
5 Stop here - dont Count
</fieldset>
<fieldset class="percent">
6 - dont Count
</fieldset>
<fieldset class="percent">
7 - dont Count
</fieldset>
<fieldset>
8 - dont Count
</fieldset>
<fieldset class="percent">
9 - dont Count
</fieldset>
<div class="result"></div>

显然,使用唯一指针来克服stackoverflow问题。有没有使用前面的代码而不只是使用using arr_t=std::array<std::array<std::array<int,1000>,1000>,1000>; std::unique_ptr<arr_t> u_ptr; std::vector是否有真正的用例?

1 个答案:

答案 0 :(得分:7)

上面的代码生成了一个包含十亿个元素的连续缓冲区,其中[]访问权限允许您将元素作为三维1000边的多维数据集获取。

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

我怀疑你在暗示

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

然后在创建后将arr_t调整为1000。这在handle对象中有额外的2指针开销的适度成本。它还允许变化的大小,这意味着确保它是固定大小的,这是用户代码必须确保的。您希望阻止一堆方法,基本上所有unique_ptr都不会暴露,以确保安全,或审核您的代码没有使用任何方法他们。

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

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

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