使用 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?我不清楚这条线的作用,但我的感受......
你的胆子是对的。
注意:分配bool
s 和new
的连续数组的代码是
bool* arr = new bool[size];
您可以使用智能指针代替原始指针来分配数组,而无需关心delete []
:
std::unique_ptr<bool[]> arrnew bool[size];
【讨论】:
如果知道size
,std::array
会更好吗?
@EdHeal 可能是的。
是的,如果大小已知,作者会使用数组,但在我正在研究的算法gist.github.com/anonymous/… 中,数组的大小由用户的输入决定。仅供参考,链接是我输入的整个实际文件的一部分
@πάντα-ῥεῖ 不明白这一点:尤其是 std::vector
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<bool>
存在某些问题。
std::vector<bool>
是std::vector<T>
的一个特化,主要是为了提高空间效率(值得商榷)。
但是,它的行为与普通的 std::vector<T>
相似,但并不相同。这主要归因于std::vector<bool>
不是通常 STL 意义上的容器,而是位数组。一般来说,使用std::vector<bool>
会造成许多破坏,它被认为是过早的优化,甚至会影响您的性能(请参阅here 的更多详细信息)。
另一件事是,在空间至关重要的嵌入式系统中,就空间效率而言,使用原始数组而不是向量是更好的选择。
std::memset(arr, 0, sizeof(bool) * (size));
呢?
std::memset
从地址arr
(即第一个输入参数)开始用给定值(即第二个输入参数)初始化内存中的一定数量的字节(即第三个输入参数)。在上面的示例中,它将用0
s 填充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 分配连续空间与使用向量?的主要内容,如果未能解决你的问题,请参考以下文章