Включите дизассемблер при входе в свою функцию и выполните 2 случая.
Локальная переменная (на основе стека) потребует 0 дополнительных циклов - вы даже не увидите, где происходит распределение, потому что функция будет распределять все локальные переменные за 1 цикл, просто перемещая указатель стека и освобождая все локальные переменные в 1 цикле, восстанавливая указатель стека. Неважно, если у вас есть 1 или 1000 локальных переменных, «распределение» занимает столько же времени.
Переменная malloc ... хорошо, вам быстро надоедает пошаговое нажатие на тысячи инструкций, которые выполняются для получения памяти из системной кучи. Кроме того, вы можете заметить, что количество циклов варьируется от вызова к вызову, в зависимости от того, сколько вещей вы уже выделили из кучи, поскольку malloc требует «поиска» в структуре кучи каждый раз, когда вы запрашиваете память.
Мое эмпирическое правило : всегда используйте стек, если это возможно, вместо malloc/free
или new/delete
. В дополнение к более высокой производительности вы получаете дополнительное преимущество: вам не нужно беспокоиться о утечке памяти или ресурсов. В C это просто означает, что вы забыли вызвать free()
, но в C ++ исключения могут испортить ваш день, если что-то выдает исключение до того, как вы вызовете delete
. Если вы используете переменные стека, все это обрабатывается автоматически! Однако используйте стек только в том случае, если речь идет о «маленьких» фрагментах памяти (байтах и КБ), а не о больших объектах (не МБ или ГБ!). В любом случае, если вы говорите об огромных объектах, вы больше не говорите о производительности и, вероятно, в любом случае не будете вызывать free/delete
в одном и том же вызове функции.