繁体   English   中英

C ++放置新的vs复制赋值

[英]C++ placement new vs copy assignment

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

_elements = new Type[capacity]

然后我添加这样的新对象

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

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

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

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

_elements = new Type[capacity]

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

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

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

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

你的追加方法:

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

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

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

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

  1. 使用复制构造函数构造对象(并通过放置`new')
  2. 不需要任何分配。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM