printПерегрузка функций и операций

printПерегрузка new и delete

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

Чтобы повысить эффективность программ, использующих динамические структуры данных, можно создать собственные варианты операций new и delete для выделения памяти под объекты некоторых классов, например, элементов списка. Эти операции определяются как статические методы класса, отдельно для одиночных объектов и массивов:
  static void *operator new(size_t, доп параметры);
  static void *operator new[](size_t, доп параметры);
  static void operator delete(void *, size_t);
  static void operator delete[](void *, size_t);
Значения для дополнительных параметров можно указать при вызове new следующим образом:
  new (доп аргументы) тип(список выражений);

Можно также перегрузить глобальную операцию new, указав дополнительные параметры. Глобальная операция new уже перегружена с дополнительным параметром типа void * (память не выделяется, а возвращается указанный адрес, используется для инициализации с помощью конструктора произвольного участка памяти, пример использования показан ниже) и nothrow_t (в случае ошибки не возникает исключительной ситуации bad_alloc, операция возвращает 0).

Пример повторной инициализации объекта с помощью перегруженной формы оператора new и явного вызова деструктора:
Vector a(100); 
... // действия с вектором размером 100
a.~Vector(); 
new(&a) Vector(200);
... // действия с вектором размером 200
loading