这里有人使用过C++的“定位new”吗?如果使用过,是用来做什么的?在我看来,它似乎只对内存映射硬件有用。
这里有人使用过C++的“定位new”吗?如果使用过,是用来做什么的?在我看来,它似乎只对内存映射硬件有用。
当你想要重新初始化全局或静态分配的结构时,这也是很有用的。
旧的 C 的方法是使用 memset()
将所有元素设置为 0。由于虚表和自定义对象构造函数的原因,你不能在 C++ 中这样做。
因此,有时我会使用下面的方法。
static Mystruct m;
for(...) {
// re-initialize the structure. Note the use of placement new
// and the extra parenthesis after Mystruct to force initialization.
new (&m) Mystruct();
// do-some work that modifies m's content.
}
如果您正在构建内核,那么从磁盘读取的内核代码或页表应该放在哪里是很有用的?您需要知道要跳转到哪里。
或者,在其他非常罕见的情况下,例如当您有大量分配的空间并想将几个结构体放在一起时,这也很有用。它们可以这样打包而无需使用offsetof()运算符。但是还有其他技巧。
我还相信一些STL实现使用放置new,例如std::vector。他们以这种方式为2^n个元素分配空间,不需要总是重新分配。
我曾经使用它来存储具有内存映射文件的对象。
一个具体的例子是图像数据库,该数据库处理了大量的大型图像(超过内存容量)。
std::vector<>
使用它是因为std::vector<>
通常会分配比vector<>
中的objects
更多的内存。
我曾使用它来基于内存中包含的从网络接收到的消息创建对象。
我曾经见过它被用作“动态类型”指针的微小性能优化(在“底层”部分):
但是这里是我用来获得小型类型快速性能的巧妙技巧:如果被保存的值可以适应于void*中,我实际上不需要分配新对象,我使用放置new将其强制放入指针本身。
void*
占用8个字节。将一个八字节的void*
指向一个一字节的bool
有点傻。但实际上可以将bool
覆盖在void*
上,就像union { bool b; void* v }
一样。您需要某种方式来知道您所调用的东西是void*
实际上是bool
(或short
、float
等)。我链接的文章描述了如何做到这一点。而且,为了回答最初的问题,放置new
是用于在期望void*
的位置创建bool
(或其他类型)的功能,(使用强制转换后可获取/修改值)。 - Max Lybbert通常,placement new 用于消除“普通 new” 的分配成本。
我使用它的另一个场景是,我想要访问尚未构建的对象的指针,以实现每个文档的单例。
p = pt
并使用Point
的赋值运算符,而要做new(&p) Point(pt)
?我想知道两者之间的区别。前者会调用Point
的operator=
,而后者会调用Point
的复制构造函数吗?但我还不是很清楚为什么一个比另一个更好。 - Andrei-Niculae Petre