Компилятор почти наверняка не сможет выполнить эту оптимизацию. На самом низком уровне распределение памяти сводится к вызовам библиотечных функций, таких как malloc
(и, на один уровень глубже, API-интерфейсам ОС). Для компилятора небезопасно предполагать, что отдельные пары malloc/free
могут быть опущены, а их хранилище может быть использовано повторно, поскольку их реализация должна находиться вне области действия оптимизатора.
Кроме того, я не думаю, что это хорошая работа для оптимизатора. Это то, что вы, программист, можете сделать без особых усилий.
Нет стандартизированной стоимости для выделения / освобождения памяти. Как правило, время выделения / освобождения может сильно различаться (например, это займет значительно больше времени, если реализация кучи пользовательского пространства будет вынуждена получать свежие страницы из диспетчера памяти ядра ОС).
Правильное практическое правило заключается в том, что небольшие распределения, скорее всего, быстрее, чем большие, и распределения должны быть медленнее, чем удаление.