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