使用 new 分配连续 space 还是使用向量?

Using new to allocate contiguous space vs using a vector?

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

bool* arr = new bool(size);

我不清楚这条线是做什么的,但我的感觉是 这个 std::memset 设置所有 param2 给出的 位置从地址 param1 开始,结束于 给定尺寸

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

Why use a new memory location like this when we have vectors?

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

Are there any Advantages?

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

SO上有很多这样的问题:

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

I am not clear what this line does but what I feel ...

你的胆子是对的。


注意:使用 new 分配 bool 的连续数组的代码是

bool* arr = new bool[size];

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

std::unique_ptr<bool[]> arr{new bool[size]};

What this line bool* arr = new bool(size); does?

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

How I could allocate an array of boolean with new?

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

bool* arr = new bool[size];

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

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

因此,您以后不必 delete []

Why use a new memory allocation like this when we have vectors?

除了 bool 之外的任何其他类型我都同意,但问题是 std::vector<bool>.

存在某些问题

std::vector<bool>std::vector<T> 的专业化,主要是为了 space 效率(有争议)。

但是,它的行为与常规 std::vector<T> 相似但不完全相同。这主要归因于 std::vector<bool> 不是通常 STL 意义上的容器,而是一个位数组。通常,使用 std::vector<bool> 会造成很多破坏,它被认为是过早的优化,甚至会降低您的性能(查看更多详细信息 here)。

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

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

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

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

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

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

从而避免调用属于谨慎使用类别的原始内存操纵器 std::memset