Stack Overflow em Português Asked by silash35 on November 30, 2021
Se toda memória alocada é definida no momento da compilação, então como isto é possível:
int num{0};
cin >> num;
int array[num];
Pelo que eu entendi, isso só poderia ser possível se usar alocação dinâmica de memória.
Primeiro, vamos combinar que esse array é estilo C e não C++.
Não sei o que quer dizer com "definida". Se isso quer dizer que está no código, sim, mas tudo está no código. Se está dizendo que a memória é alocada durante a compilação, não, isso seria impossível.
Talvez haja uma confusão de conceitos aí.
Existe da diferença entre tempo de compilação, que muitas vezes chamamos de estática, e tempo de execução que chamamos de dinâmica. A estática é definida em em tempo de compilação e não muda. Acho que é isso que está falando. Portanto se no código criar um com 10 elementos, ele não poderá ter qualquer coisa diferente disso. O código já sabe o valor. Mas a alocação dele só ocorre durante a execução, nem poderia ser diferente, então a alocação é dinâmica.
Bem, é possível ter a alocação em antecipada se estiver em área estática, o que não é o caso, ainda assim há uma alocação na carga do executável, a alocação não ocorre antes, só é mais simples e determinado antecipadamente.
Agora vamos usar os mesmos termos em outro contexto, apesar de muito próximo.
Quando você aloca memória no heap, e só nele (geralmente através do malloc()
) chamamos de alocação dinâmica. A palavra dinâmica aqui não pode ser interpretada sozinha, estamos falando de alocação em área dinâmica. Ou seja, área que é gerenciada conforme a necessidade e o tempo de vida não é determinado.
Então o que não está no heap é estática? Não exatamente. Se é um dado que já vem no executável, a alocação é feita em área estática, ela já está lá pronta desde a compilação, carregou o executável, pode acessar. Geralmente não pode escrever lá.
Existe ainda uma área chamada de automática, que alguns acham que é estática, e não bem assim. Esta área é representada pela stack (tipicamente). A área toda da pilha é de fato é estática, é uma área que é reservada, e de certa forma podemos falar em alocação, durante a carga do executável, e de forma geral não muda durante toda execução do processo (ou da thread onde a alocação é feita na carga da thread).
Mas os dados que vão nela são alocados individualmente sob demanda do código de acordo com a execução do momento. Esta alocação não é estática. Podemos chamar de dinâmica? Até podemos, mas não da mesma forma que o heap, por isso que é chamada de automática, afinal o tempo de vida é determinado e você não precisa gerenciar manualmente.
Tanto a área dinâmica com a automática podem ter dados alocados conforme a necessidade, nesse sentido chamamos de dinâmica. Talvez deveria ter outro nome, sei lá, flexível, sob demanda, ou algo assim.
Então não tem algo de especial nisso. Você está alocando a área do vetor a ser alocada dentro da pilha no momento da execução.
Precisa entender o funcionamento da pilha para compreender todas implicações disto. No link acima tem informações sobre.
Declarar a variável só indica que vai usá-la e que precisará de um espaço para dados. Esse espaço pode ser determinado no momento anterior ao seu uso, a não ser se já estiver encrustado no executável.
Answered by Maniero on November 30, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP