c++中的定位new操作符是什么,java中有吗?

what is placement new operator in C++ and does java has it?

本文关键字:java 操作符 定位 new c++ 是什么      更新时间:2023-10-16

我听说过c++中的位置new操作符。我不明白这是什么。然而,我可以看到它可以在stackoverflow的问题下使用。我也很困惑我们是否在java中有这个。所以我的问题非常精确:什么是放置新操作符,我们在java中有类似的东西吗?

请注意,不要与stackoverflow上的其他问题混淆:它们不是这个问题的重复

下面的文章解释了在c++中放置new的含义:http://www.glenmccl.com/nd_cmp.htm

这个术语本身与重载的new语句相关。由于Java根本不允许重载操作符,特别是new操作符,因此new的位置与Java无关。

但是你有几个选择。

  1. 使用工厂或构建器模式
  2. 使用包装器/装饰器模式(可能与工厂一起),允许通过包装类的方法来更改某些类的功能。
  3. 面向方面编程。它的工作原理几乎类似于装饰器模式,但可以使用字节码修改来实现。
  4. 类加载器拦截

术语"placement new"本身有点模棱两可。使用这个术语在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的逻辑水平可能已经降低到足以达到随机访问内存的概念。