gpt4 book ai didi

C++ placement new vs 复制赋值

转载 作者:太空狗 更新时间:2023-10-29 19:57:47 24 4
gpt4 key购买 nike

我在某处读到 vector 在内部使用 placement new 来构建对象。当我尝试实现类似的容器时,我通常以这样的方式结束分配

_elements = new Type[容量]

然后我像这样附加新对象

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]

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

考虑一个在其默认构造函数中确实具有显着副作用的类型并对其进行一些实验可能有助于您的理解:

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

有了上面的Type , 如果你这样做 new Type[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 调用赋值运算符.因此,将对象添加到容器中需要:

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

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

  1. 对象是使用复制构造函数构造的(并通过放置“new”)
  2. 不需要分配。

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

关于C++ placement new vs 复制赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29842801/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com