Что такое размещение нового оператора в C ++ и есть ли в Java? - PullRequest
0 голосов
/ 14 сентября 2011

Я слышал о размещении нового оператора C ++. Я запутался, что это такое. Тем не менее, я вижу, где это может быть использовано под вопросом в stackoverflow. Я также смущен, есть ли у нас это в Java или нет. Поэтому мой вопрос очень точный: что такое оператор размещения и есть ли у нас что-то подобное в Java?

Обратите внимание, не путайте с другими вопросами по stackoverflow: они не являются дубликатами этого вопроса.

Ответы [ 3 ]

3 голосов
/ 14 сентября 2011

Следующая статья объясняет смысл размещения нового в C ++: http://www.glenmccl.com/nd_cmp.htm

Этот термин сам по себе важен для перегруженного оператора new. Поскольку Java вообще не позволяет перегрузить операторы и, в частности, новый оператор, размещение нового не имеет значения для Java.

Но у вас есть несколько альтернатив.

  1. Используя фабричный или строительный шаблон
  2. Использование шаблона оболочки / декоратора (возможно, вместе с фабрикой), который позволяет изменять некоторые функциональные возможности класса, оборачивая его методы
  3. Аспектно-ориентированное программирование. Он работает почти как шаблон декоратора, но может быть реализован с использованием модификации байтового кода.
  4. Класс перехвата загрузчика
2 голосов
/ 14 сентября 2011

Сам термин «размещение новых» несколько двусмыслен.Этот термин используется в стандарте 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 управление памятью интегрировано в язык и не является частьюбиблиотека, поэтому не может быть эквивалентов.

0 голосов
/ 14 сентября 2011

Placement new позволяет указывать пользовательские распределители, которые принимают дополнительные параметры.

Существует также предопределенный распределитель размещения, который принимает в качестве дополнительного параметра указатель и который просто возвращает в результате выделения этого указателя, в основном позволяя вашему коду создавать объекты по указанному вами адресу.

Однако вы можете определить другие типы распределителей, которые принимают другие параметры, например, наш распределитель отладки принимает в качестве дополнительных параметров имя файла и строку, в которой выполняется выделение. Хранение этой дополнительной информации в выделенном объекте позволяет нам отслеживать исходный код, в котором был создан определенный экземпляр объекта, который, например, утек, перезаписан или использован после освобождения.

AFAIK Java работает на более высоком концептуальном уровне и не имеет концепции указателя (только исключение нулевого указателя ;-)). Память - это просто черный волшебный ящик, и программист никогда не использует идею адреса памяти.

Я знал только Java 1.1, и тогда решил не тратить время на этот коммерческий продукт, так что, возможно, сегодня логический уровень Java достаточно низок, чтобы достичь концепции оперативной памяти.

...