C++: удалите по сравнению со свободным и производительностью

26
задан stkent 19 March 2018 в 00:27
поделиться

7 ответов

Некоторая производительность отмечает о новом/удалял и malloc/free:

malloc и свободный не делают , вызывают конструктора и deconstructor, соответственно. Это означает, что Ваши классы не получат initalized или deinitialized автоматически, который мог быть плохим (например, uninitalized указатели)! Это не имеет значения для типов данных POD как символ и удваивается, тем не менее, так как у них действительно нет ctor.

новый и удаляют , делают , вызывают конструктора и deconstructor. Это означает, что Ваши экземпляры класса являются initalized и deinitialized автоматически. Однако обычно существует хит производительности (по сравнению с простым выделением), но это к лучшему.

я предлагаю остаться согласовывающимся с new/malloc использованием, если у Вас нет причины (например, перевыделение). Таким образом, у Вас есть меньше зависимостей, уменьшая Ваш размер кода и время загрузки (только smidgin, хотя). Кроме того, Вы не испортите free'ing что-то выделенное с новым, или удаление чего-то выделенного с malloc. (Это, скорее всего, вызовет катастрофический отказ!)

61
ответ дан strager 28 November 2019 в 06:09
поделиться

Ответ 1: И free(p) и delete p хорошо работают с Нулевым указателем.

Ответ 2: Невозможный ответить, не видя медленные части кода. Необходимо представить код! Если Вы используете Linux, я предлагаю использовать Callgrind (часть Valgrind) для обнаружения, какие части выполнения занимает большую часть времени.

13
ответ дан activout.se 28 November 2019 в 06:09
поделиться

Подвергните сомнению тот: ничего не произойдет.

Из текущего проекта ISO/IEC 14882 (или: C++):

20.8.15 библиотек [c.malloc]

C содержание [<cstdlib>, который является: где free жизни] совпадают со Стандартной библиотекой для C [(см. intro.refs для того)] заголовок <stdlib.h>, со следующими изменениями: [ничто, что производит этот ответ].

Так, от ISO/IEC 9899:1999 (или: C):

7.20.3.2 free функция

, Если ptr [параметр] нулевой указатель, , никакое действие не происходит .

Из стандарта C++ снова, для получения информации [приблизительно 115] на этот раз:

3.7.4.2 [basic.stc.dynamic.deallocation]

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

См. также:

10
ответ дан Community 28 November 2019 в 06:09
поделиться

Ничего не произойдет, если Вы назовете свободными с ПУСТЫМ параметром или удалите с ПУСТЫМ операндом. Оба определяются, чтобы принять ПУСТОЙ УКАЗАТЕЛЬ и не выполнить действие.

существует любое количество вещи, которую можно изменить в коде C++, который может влиять, как быстро это работает. Часто самые полезные (в приблизительном порядке):

  • Использование хорошие алгоритмы. Это - большая тема, но например, я недавно разделил на два время выполнения небольшого количества кода при помощи станд.:: вектор вместо станд.:: список, в случае, где элементы добавлялись и удалялись только в конце.
  • Стараются не повторять долгие вычисления.
  • Стараются не создавать и копировать объекты излишне (но что-либо, что происходит меньше чем 10 миллионов раз в минуту, не будет иметь никакого значительного значения, если Вы не обработаете что-то действительно большой , как вектор 10 миллионов объектов).
  • Компиляция с оптимизацией.
  • Mark наиболее часто используемые функции (снова, что-либо позвонившее больше чем 100 миллионов раз в Вашем 10-минутном времени выполнения), как встроенные.

Однако divideandconquer является абсолютно правильным - Вы не можете эффективно ускорить свою программу, если Вы не знаете то, что это проводит свое время, делая. Иногда это может быть предположено правильно, когда Вы знаете, как код работает, другие времена, это очень удивительно. Так лучше представлять. Даже если Вы не можете представить код для наблюдения точно, где время проведено, если Вы измеряете то, что вызывает Ваши изменения, имеют Вас, может часто понимать его в конечном счете.

4
ответ дан Steve Jessop 28 November 2019 в 06:09
поделиться

По вопросу 2:
Предыдущие ответы превосходны. Но я просто хотел добавить что-то о предварительной оптимизации. Принимая программу умеренной сложности, правило 90/10 обычно применяется - т.е. 90% времени выполнения потрачены в 10% кода. "Оптимизированный" код часто более трудно считать и поддержать. Так, всегда решайте проблемы сначала, затем смотрите, где узкие места (профилирование является хорошим инструментом).

2
ответ дан E Dominique 28 November 2019 в 06:09
поделиться

Поскольку другие указали на удаление (или освобождение), Нулевой указатель ничего не сделает. Однако при выделении некоторой памяти тогда, использовать ли свободный () или удалить, зависит от метода, Вы раньше выделяли их. Например, при использовании malloc () для выделения памяти тогда, необходимо освободить () и если Вы использовали новый для выделения тогда, необходимо использовать, удаляют. Однако бойтесь смешивать выделения памяти. Используйте единственный способ выделить и освободить их.

Для второго вопроса, будет очень трудно сделать вывод, не видя фактический код. Это должно быть взято на индивидуальной основе.

2
ответ дан Naveen 28 November 2019 в 06:09
поделиться

Хорошие ответы все.

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

правило 90/10 верно. По моему опыту, обычно существует несколько горячих точек, и они обычно в середине уровней стека вызовов. Они часто вызываются при помощи сверхобщих структур данных, но Вы никогда не должны фиксировать что-то, если Вы не доказали, что это на самом деле - проблема. Проблемы производительности удивительно непредсказуемы.

Решение любой единственной проблемы производительности не может дать Вам ускорение, в котором Вы нуждаетесь, но каждый, которого Вы фиксируете, заставляет остающиеся взять больший процент остающегося времени, таким образом, они становятся легче найти. Ускорения объединяются составленным способом, таким образом, Вы можете быть удивлены конечным результатом.

, Когда Вы больше не можете находить значительные проблемы, которые можно решить, Вы сделали о, а также Вы можете. Иногда, в той точке, модернизация (такая как использование генерации кода) может выделить дальнейший раунд ускорений.

1
ответ дан Community 28 November 2019 в 06:09
поделиться
Другие вопросы по тегам:

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