Почему являются новыми ()/, удаляют () медленнее, чем malloc () / свободный ()?

То, почему новый () / удаляют () медленнее, чем malloc () / свободный ()?

Править:

Спасибо за ответы до сих пор. Укажите на спецификации стандартной реализации C++ новых () и удалите (), если у Вас есть они Спасибо!

10
задан Viet 22 September 2016 в 17:44
поделиться

4 ответа

Взгляните на этот фрагмент кода 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 () .)

26
ответ дан 3 December 2019 в 13:27
поделиться

new и delete имеют дело со строительством / разрушением, часть их работы - это эффективный вызов malloc () и free () - malloc () и free () являются выделением / освобождением необработанной памяти.

13
ответ дан 3 December 2019 в 13:27
поделиться

Если вы используете их для размещения "простых старых данных", так что конструктор / деструктор являются тривиальными, они вряд ли будут существенно отличаться по скорости от malloc / бесплатно . Возможно (вероятно?), Что где-то в ваших измерениях вы допустили ошибку, которая исказила результаты.На самом деле все, что они делают, кроме вызова malloc / free , - это конструктор / деструктор типа выполнения (несколько раз для массивов).

4
ответ дан 3 December 2019 в 13:27
поделиться

Когда вызывается оператор new , происходят две вещи:

  1. Память выделяется для объекта в куче.
  2. Вызывается конструктор объекта.

Таким образом, из-за накладных расходов на создание объектов new работает медленнее, чем malloc .

Аналогичным образом delete выполняет следующие две операции:

  1. Вызывает деструктор объекта кучи.
  2. Освобождает память объекта.

Короче говоря, malloc выделяет только необработанную память, тогда как new не только выделяет необработанную память, но и превращает необработанную память в объекты.

4
ответ дан 3 December 2019 в 13:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: