其他分享
首页 > 其他分享> > C放置新vs复制分配

C放置新vs复制分配

作者:互联网

在某处,我读到该向量内部使用了新的对象构造.当我尝试实现类似的容器时,我通常最终得到了类似的分配

_elements = new类型[容量]

然后我添加这样的新对象

void append(const T& element) {
    // reallocation in case if capacity is equal to size
    _elements[size++] = element;
}

这种结构通过复制和施工是否有任何表现或其他差异?

解决方法:

Is there any performance or other difference between this construction by copying and construction by placement new?

当然.如果构造一个数组:

_elements = new Type[capacity]

…然后必须初始化阵列的元素,直到容量.这意味着将创建许多“默认”Type对象.另一方面,当使用placement new时,您不会初始化数组,而只是分配空间,并根据需要构造对象.这是更高效和语义上的不同,因为没有创建初始对象(请记住,创建它们可能有副作用).

这可能有助于您理解思考并使用在其默认构造函数中确实具有突出副作用的类型进行一些实验:

class Type
{
    public:
    Type()
    {
       cout << "Created Type." << endl;
    }
};

使用上面的类型,如果您执行新的类型[3],您将看到三条消息打印到cout.另一方面,如果你创建一个std :: vector< Type>容量为3时,您不应该看到任何打印到cout的消息.

你的追加方法:

void append(const T& element) {
    // reallocation in case if capacity is equal to size
    _elements[size++] = element;
}

为T调用赋值运算符.因此,将对象添加到容器中需要:

>首先使用默认构造函数构造对象
>调用赋值运算符

将其与标准库容器进行对比:

>使用复制构造函数构造对象(并通过放置`new’)
>不需要任务.

另一个考虑因素是,如果Type没有可访问的默认构造函数,则通常不能调用new Type [x].如果你改变public:在上面的例子中改为private:,你会发现这一点.仍然可以创建一个(空的)std :: vector< Type>但是,只要将另一个(可用的)构造函数添加到Type,您仍然可以向其中添加对象.

标签:placement-new,c
来源: https://codeday.me/bug/20190722/1504983.html