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

时间:2017-03-12 10:25:02

标签: c++ c++11 memory dynamic memset

为什么在有向量时使用这样的新内存位置?
有什么好处吗?

bool* arr = new bool(size);

我不清楚这条线的作用,但我的感受是什么 这std::memset设置了param2给出的所有param1 地址从std::memset(arr, 0, sizeof(bool) * (num+1)); 开始,到达地址 给定大小

$(document).ready(function(){

(function() {
    var itemTracker = {
        // init
        init: function() {
            this.bindEvents();
        },

        // cacheDom
        cacheDom: {
            inputAdd: $('#inputAdd'),
            submitAdd: $('#submitItem')
        },

        // item
        item: {
            text: this.inputAdd.value,
        },

        // Bind Events
        bindEvents: function() {
            this.submitAdd.on("click", addItem);
        },

        // Add item
        addItem: function() {
            console.log("test");
        }

        // Remove item

        // Edit Item

        // Complete Item

        // Uncomplete Item
    };

    itemTracker.init();

})();

});

2 个答案:

答案 0 :(得分:4)

  

为什么在有矢量时使用这样的新内存位置?

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

  

有什么优势吗?

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

SO上有很多这样的问题:

  

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

你的胆量是正确的。

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

bool* arr = new bool[size];

您可以使用智能指针来分配数组,而不需要关心delete []

,而不是原始指针
std::unique_ptr<bool[]> arr{new bool[size]};

答案 1 :(得分:3)

  

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

此行在堆中分配一个布尔值,如果true则将其初始化为size != 0,如果false则将其初始化为size == 0。然后,它将新分配的布尔值的地址分配给布尔指针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开始的给定值(即第二输入参数)初始化存储器中的一定数量的字节(即第三输入参数)(即,第一输入参数)。在上面的示例中,它将arr填充0 s,最多size个字节。也就是说,如果arr是一个大小为size的数组,它会将此布尔数组的所有元素初始化为false

无论如何,您可以使用以下方案:

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

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

因此避免调用原始内存操作符std::memset,这些操作符属于谨慎使用类别。