Посмотрите на этот кусок кода C:
struct data* pd = malloc(sizeof(struct data));
init_data(pd);
Оператор new
в C ++, по сути, делает то, что делает вышеуказанный фрагмент кода. Вот почему это медленнее, чем malloc()
.
Аналогично с delete
. Это делает эквивалент этого:
deinit_data(pd);
free(pd);
Если конструкторы и деструкторы пусты (как для встроенных модулей), new
и delete
не должны быть медленнее, чем malloc()
и free()
. (Если они равны , это часто происходит из-за того, что обычные реализации вызывают malloc()
/ free()
под капотом, поэтому они являются оберткой вокруг них. Оборачивание затрат. Также может существовать код, который нужно выяснить, что нельзя вызывать конструкторы / деструкторы. Это тоже будет стоить.)
Редактировать Чтобы ответить на дополнительный вопрос:
new
и delete
не являются функциями, они являются операторами. Это: new data()
называется новым выражением . Это делает две вещи. Сначала он вызывает operator new
, затем инициализирует объект, обычно вызывая соответствующий конструктор. (Я говорю «обычно», потому что встроенные модули не имеют конструкторов. Но новое выражение, включающее встроенные, работает тем же.)
Вы можете манипулировать обеими этими фазами. Вы можете создавать свои собственные конструкторы, чтобы манипулировать инициализацией ваших типов, и вы можете перегрузить operator new
(даже с несколькими перегрузками, имеющими разные дополнительные аргументы, а также специально для каждого класса, если хотите), чтобы манипулировать выделением свободного хранилища. Если вы не реализуете собственный operator new
, используется версия из стандартной библиотеки. Распространенная реализация этого вызывает malloc()
.
Аналогичным образом, если вы напишите delete pd
, который называется delete expression , произойдут две вещи: в зависимости от pd
, объект деинициализируется, обычно вызывая его деструктор, затем память освобожден путем вызова соответствующего operator delete
.
Опять же, вы можете управлять обеими фазами, написав собственный деструктор и написав собственную версию operator delete
. (Версия operator delete
, входящая в стандартную библиотеку, часто используется для вызова free()
.)