Почему я всегда слышу, чтобы избежать выделения памяти, когда я могу это сделать в C?

Мне всегда говорят не выделять память, когда я могу добиться того же результата без нее. Люди говорят это потому, что освобождение элементов кода может занять некоторое время, или этому есть объяснение, ориентированное на эффективность? (например, лучшая производительность)

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

guard3 04.02.2023 20:31

В C выделение памяти с помощью malloc похоже на быструю езду по автомагистралям с ограниченным доступом. Это то, что вы не делаете, если вам не нужно, но если вам нужно, это единственный выход.

Steve Summit 04.02.2023 20:38

Всегда дороже сделать что-то, чем не сделать. В общем, вы должны избегать делать что-либо ненужное.

Chris Dodd 04.02.2023 22:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
111
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

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

См. также: Почему выделение памяти в куче НАМНОГО медленнее, чем в стеке? и Malloc или обычное определение массива? и Когда мне нужна динамическая память?

В противовес принятому ответу:

Хотя это действительно хороший совет — избегать использования malloc, когда он вам не нужен, важно знать, как правильно использовать его, когда он вам нужен, потому что во многих случаях он вам нужен! На самом деле я бы даже сказал, что почти любая программа, которая делает что-то интересное с данными, захочет динамически выделять память для этих данных.

Например, если вы пишете текстовый редактор, вы не захотите ограничивать своих пользователей каким-то фиксированным максимальным количеством строк текста, которое вы статически выделили при написании текстового редактора — вы захотите выделяйте структуры данных для такого количества строк текста, которое ваш пользователь редактирует в любой день. Может быть, всего несколько, а может быть, огромное количество.

Это правда, что при неправильном использовании malloc может возникнуть много ошибок. Но есть также множество шаблонов кодирования, которые позволяют безопасно и удобно использовать malloc. Эти шаблоны стоит изучить и использовать!

Другие вопросы по теме