使用 new 分配连续空间与使用向量?

Posted

技术标签:

【中文标题】使用 new 分配连续空间与使用向量?【英文标题】:Using new to allocate contiguous space vs using a vector? 【发布时间】:2017-03-12 10:25:02 【问题描述】:

当我们有向量时,为什么要使用这样的新内存位置? 有什么优势吗?

bool* arr = new bool(size);

我不清楚这条线的作用,但我的感觉是 这个std::memset 设置了所有param2 地址从param1 开始并在 给定大小

std::memset(arr, 0, sizeof(bool) * (num+1));

【问题讨论】:

您的标题和内容不匹配,请说明您要做什么。 bool* arr = new bool(size);不是数组。 真的很抱歉我是 C++ 编程新手,是 bool* arr = new bool(size);不创建连续空间? 正确的形式是使用方括号 [ ] 创建数组,请参阅链接 cplusplus.com/doc/tutorial/arrays gist.github.com/anonymous/…,我正在学习这个。 【参考方案1】:

当我们有向量时,为什么要使用这样的新内存位置?

我们不知道为什么作者在这里使用 new。惯用的方法是使用std::vector<bool>

有什么优势吗?

通常不会,但特别是std::vector<bool> 是有问题的,因为有一个专门化不适用于其他类型。

SO上有很多这样的问题:

Why vector::reference doesn't return reference to bool?

我不清楚这条线的作用,但我的感受......

你的胆子是对的。


注意:分配bools 和new 的连续数组的代码是

bool* arr = new bool[size];

您可以使用智能指针代替原始指针来分配数组,而无需关心delete []

std::unique_ptr<bool[]> arrnew bool[size];

【讨论】:

如果知道sizestd::array 会更好吗? @EdHeal 可能是的。 是的,如果大小已知,作者会使用数组,但在我正在研究的算法gist.github.com/anonymous/… 中,数组的大小由用户的输入决定。仅供参考,链接是我输入的整个实际文件的一部分 @πάντα-ῥεῖ 不明白这一点:尤其是 std::vector 是有问题的,因为有一个专业化不适用于其他类型。 @Ramachandrajr 我会添加一个链接。【参考方案2】:

bool* arr = new bool(size); 这一行是做什么的?

这一行在堆中分配一个布尔值,如果size != 0 将其初始化为true,如果size == 0 将其初始化为false。然后它将新分配的布尔值的地址分配给布尔指针arr。所以这里没有数组可以玩。

如何使用new 分配布尔数组?

在堆中分配数组的正确方法是使用运算符new[]。你的情况就是这样:

bool* arr = new bool[size];

随着智能指针的出现,您还可以使用std::unique_ptr

std::unique_ptr<bool[]> arr(new bool[size]);

因此,之后您不必delete []

当我们有向量时,为什么要使用这样的新内存分配?

除了bool 之外的任何其他类型我都同意,但问题是std::vector&lt;bool&gt; 存在某些问题。

std::vector&lt;bool&gt;std::vector&lt;T&gt; 的一个特化,主要是为了提高空间效率(值得商榷)。

但是,它的行为与普通的 std::vector&lt;T&gt; 相似,但并不相同。这主要归因于std::vector&lt;bool&gt; 不是通常 STL 意义上的容器,而是位数组。一般来说,使用std::vector&lt;bool&gt; 会造成许多破坏,它被认为是过早的优化,甚至会影响您的性能(请参阅here 的更多详细信息)。

另一件事是,在空间至关重要的嵌入式系统中,就空间效率而言,使用原始数组而不是向量是更好的选择。

std::memset(arr, 0, sizeof(bool) * (size)); 呢?

std::memset 从地址arr(即第一个输入参数)开始用给定值(即第二个输入参数)初始化内存中的一定数量的字节(即第三个输入参数)。在上面的示例中,它将用0s 填充arr,直到size 字节数。也就是说,如果arr 是一个大小为size 的数组,它将把这个布尔数组的所有元素初始化为false

但是,您也可以使用以下方案:

bool* arr = new bool[size]();
                          ^^

std::unique_ptr<bool[]> arr(new bool[size]());

因此避免调用原始内存操纵器 std::memset 属于谨慎使用类别。

【讨论】:

哇,你的回答很酷,但不能投票:p 我没有足够的分数。要点: 1. new bool(size)

以上是关于使用 new 分配连续空间与使用向量?的主要内容,如果未能解决你的问题,请参考以下文章

堆中连续分配对象的动态向量

连续内存分配:内存碎片与分区的动态分配

C++二维数组离散动态和连续动态空间申请

delete与delete[]

标准模板库中的向量(vector)

在C++中怎么通过New申请多个连续的存储空间?