Os computadores modernos têm várias camadas de memória cache, além de um sistema de memória principal grande, mas lento. Pode-se fazer dezenas de acessos à memória cache mais rápida no tempo necessário para ler ou gravar um byte do sistema de memória principal. Portanto, acessar um local mil vezes é muito mais rápido do que acessar 1.000 (ou mesmo 100) locais independentes uma vez cada. Como a maioria dos aplicativos aloca e desaloca repetidamente pequenas quantidades de memória próximo ao topo da pilha, os locais na parte superior da pilha são usados e reutilizados uma quantidade enorme, de modo que a grande maioria (99% + em um aplicativo típico) de acessos de pilha podem ser tratados usando memória cache.
Por outro lado, se um aplicativo criar e abandonar repetidamente objetos de heap para armazenar informações de continuação, todas as versões de todos os objetos de pilha que já foram criados teriam que ser gravadas na memória principal. Mesmo que a grande maioria desses objetos fosse completamente inútil quando a CPU quisesse reciclar as páginas de cache em que eles começaram, a CPU não teria como saber disso. Conseqüentemente, a CPU precisaria perder muito tempo executando gravações lentas de informações inúteis na memória. Não é exatamente uma receita de velocidade.
Outra coisa a considerar é que, em muitos casos, é útil saber que uma referência de objeto passada para uma rotina não será usada quando a rotina terminar. Se parâmetros e variáveis locais são passados através da pilha e se a inspeção do código da rotina revelar que ela não persiste em uma cópia da referência passada, o código que chama a rotina pode ter certeza de que, se nenhuma referência externa ao objeto existia antes da chamada, nenhum existirá depois. Por outro lado, se parâmetros foram passados por meio de objetos heap, conceitos como "após o retorno de uma rotina" se tornam um pouco mais nebulosos, pois se o código mantivesse uma cópia da continuação, seria possível que a rotina "retornasse" mais de uma vez após um chamada única.