Мне всегда говорят не выделять память, когда я могу добиться того же результата без нее. Люди говорят это потому, что освобождение элементов кода может занять некоторое время, или этому есть объяснение, ориентированное на эффективность? (например, лучшая производительность)
В C выделение памяти с помощью malloc
похоже на быструю езду по автомагистралям с ограниченным доступом. Это то, что вы не делаете, если вам не нужно, но если вам нужно, это единственный выход.
Всегда дороже сделать что-то, чем не сделать. В общем, вы должны избегать делать что-либо ненужное.
Потому что управление памятью сложно и подвержено всевозможным ошибкам. Слишком легко забыть free()
что-то, или free()
что-то дважды, или использовать что-то после free()
использования. Выделение памяти из кучи также обходится дороже и требует значительных накладных расходов.
Мне всегда говорят не выделять память всякий раз, когда я могу достичь то же самое без него.
И это хороший совет. Откажитесь от динамического выделения памяти, когда можно обойтись без него. Вы должны выделять память из кучи только тогда, когда размер выделения неизвестен во время компиляции, например, при вводе пользователем. Но даже тогда вы должны указать верхнюю границу.
См. также: Почему выделение памяти в куче НАМНОГО медленнее, чем в стеке? и Malloc или обычное определение массива? и Когда мне нужна динамическая память?
В противовес принятому ответу:
Хотя это действительно хороший совет — избегать использования malloc
, когда он вам не нужен, важно знать, как правильно использовать его, когда он вам нужен, потому что во многих случаях он вам нужен! На самом деле я бы даже сказал, что почти любая программа, которая делает что-то интересное с данными, захочет динамически выделять память для этих данных.
Например, если вы пишете текстовый редактор, вы не захотите ограничивать своих пользователей каким-то фиксированным максимальным количеством строк текста, которое вы статически выделили при написании текстового редактора — вы захотите выделяйте структуры данных для такого количества строк текста, которое ваш пользователь редактирует в любой день. Может быть, всего несколько, а может быть, огромное количество.
Это правда, что при неправильном использовании malloc
может возникнуть много ошибок. Но есть также множество шаблонов кодирования, которые позволяют безопасно и удобно использовать malloc
. Эти шаблоны стоит изучить и использовать!
Игнорируя тот факт, что выделение вводит нюансы отслеживания ваших указателей и ответственности за освобождение, выделение является дорогостоящей операцией. Если вы знаете, сколько памяти вам понадобится для чего-то, избегайте выделения (если вам не нужен очень большой объем, который заполнил бы ваш стек).