【发布时间】:2018-09-09 03:59:44
【问题描述】:
这个问题来自this线程的评论部分,并且在那里也得到了答案。但是,我认为只留在评论部分太重要了。所以我为它做了这个问答。
Placement new 可用于在分配的存储中初始化对象,例如,
using vec_t = std::vector<int>;
auto p = (vec_t*)operator new(sizeof(vec_t));
new(p) vec_t{1, 2, 3}; // initialize a vec_t at p
根据cppref,
新展示位置
如果提供了placement_params,它们将作为附加参数传递给分配函数。这种分配函数被称为“placement new”,在标准分配函数
void* operator new(std::size_t, void*)之后,简单地返回其第二个参数不变。这用于在分配的存储中构造对象 [...]
这意味着new(p) vec_t{1, 2, 3} 只是返回p,而p = new(p) vec_t{1, 2, 3} 看起来是多余的。忽略返回值真的可以吗?
【问题讨论】:
-
是的,据我所知,这是常见的做法。
-
只有placement array new 有问题。但无论如何,那个本身就无法携带。
-
@DeiDei 我也这么认为...直到今天:)
标签: c++ initialization compiler-optimization placement-new