使用 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
。
当我们有向量时,为什么要使用这样一个新的内存位置?
有什么好处吗?
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
。