我听说过 C++ 的placement new 运算符。我很困惑它是什么。但是,我可以看到它可以在stackoverflow中的问题下使用。我也很困惑我们是否在java中有这个。所以我的问题非常准确:什么是placement new 运算符,我们在java 中有类似的东西吗?
请注意,不要与 stackoverflow 上的其他问题混淆:它们不是这个问题的重复。
我听说过 C++ 的placement new 运算符。我很困惑它是什么。但是,我可以看到它可以在stackoverflow中的问题下使用。我也很困惑我们是否在java中有这个。所以我的问题非常准确:什么是placement new 运算符,我们在java 中有类似的东西吗?
请注意,不要与 stackoverflow 上的其他问题混淆:它们不是这个问题的重复。
以下文章解释了 C++ 中放置 new 的含义:http ://www.glenmccl.com/nd_cmp.htm
该术语本身与重载new
语句相关。由于 Java 根本不允许重载运算符,特别是 new 运算符,因此放置 new 与 Java 无关。
但是你有几种选择。
“新安置”一词本身有些含糊。该术语在 C++ 标准中以两种不同的方式使用,因此被 C++ 社区使用。
第一个含义是指任何operator new
具有多个参数的重载函数。附加参数几乎可以用于任何事情——标准本身有两个示例:operator new(size_t, void*)
和operator new(size_t,
std::nothrow_t const&)
.
第二个含义是指具体的重载operator new(size_t,
void*)
,实际上是用来显式调用从别处获得的内存上的对象的构造函数:将分配与初始化分开。std::vector
(例如,它将用于capacity()
可能大于的类中size()
。)
在 Java 中,内存管理被集成到语言中,而不是库的一部分,因此没有等价物。
Placement new 允许指定采用额外参数的自定义分配器。
还有一个预定义的放置分配器,它将一个指针作为额外参数,并作为分配该指针的结果返回,基本上允许您的代码在您指定的地址创建对象。
但是,您可以定义采用其他参数的其他类型的分配器,例如我们的调试分配器将文件名和执行分配的行作为额外参数。将这些额外信息与分配的对象一起存储允许我们回溯到源代码,在该源代码中创建了某个对象实例,例如在释放后被泄露、覆盖或使用。
AFAIK Java 在更高的概念级别上工作,并且没有指针概念(只有空指针异常;-))。内存只是一个黑魔法盒,程序员从不使用内存地址的想法。
我只知道 Java 1.1,然后决定不花时间在那个商业产品上,所以今天 Java 的逻辑级别可能已经降低到足以达到随机存取内存的概念。