使用指向预分配内存的指针的单个参数的placement-new表达式将在该内存中构造一个类型为T的对象。
为什么它调用标准的placement-new运算符void* operator new ( std::size_t count, void* ptr );,因为后者什么也不做,只返回指针参数?
int x = 10;
int* p = new(&x) int{1024};您能解释一下编译器在x内存地址中构造新的int所采取的步骤吗?
placement-new表达式不直接在它作为指针获得的内存地址上构造一个对象,而不是调用一个什么都不做并且只返回指针参数的运算符函数?发布于 2021-06-16 00:12:46
一般规则是new (args...) T将调用operator new(sizeof(T), args...),返回void*需要此函数。如果此operator new调用成功返回,则将该对象构造到返回值所指向的内存中。
这个一般规则足够强大,既支持普通的新表达式new int,也支持布局表单new (&x) int,没有任何特殊情况。这两个表达式调用不同的operator new重载,这就是前者分配和后者不分配的原因。无论如何,对象都是在末尾构造的(除非operator new函数通过抛出异常而失败)。
没有必要有一个特殊的规则在语言中说,operator new不被一个新的布局表达式调用。相反,编译器可以通过直接将int对象构造为&x而不首先调用operator new来优化代码,因为它已经知道since operator new只会返回其第二个参数。
(实际上,现实比这复杂一些。如果T是数组类型,则调用operator new[]而不是operator new,编译器可能会从operator new[]请求比数组实际占用的内存更多的内存,并在构造数组之前调整返回的指针。也有一些特殊的规则有关的过度对齐类型,实际上有一些特殊的大小写放置新的和删除。这些细节与这个答案无关。)
https://stackoverflow.com/questions/67994689
复制相似问题