Prévia do material em texto
Organização de memória - Compiladores Exercícios 1. Gerir os recursos disponibilizados pela máquina é um processo que demanda habilidade tanto do desenvolvedor quanto da eficiência do compilador. A alocação de memória, qualquer que seja consiste em: Você acertou! E. atribuir espaço suficiente e o tipo de alocação mais adequado para cada variável. A reserva de espaço extra pode ocorrer em variáveis cujo tamanho é desconhecido, embora a maioria delas já tenha um tamanho definido. A alocação de memória pode lidar com o código a ser executado, mas para alocá-lo na memória RAM em tempo de execução, enquanto a posição em um disco rígido é atribuição do sistema operacional. A seleção de registradores diz respeito ao processo de otimização do código. A eliminação de objetos não mais referenciados faz parte do processo de coleta de lixo na memória heap, mas que não está necessariamente presente, tampouco integrando outras formas de alocação. No entanto, para todos os casos, é necessário encontrar a quantidade de memória suficiente para armazenar um dado e se este poderá ou não ser alterado — não podendo ser estático —, além do tempo de vida para determinar entre as modalidades de alocação dinâmica. 2. As variáveis alocadas estaticamente não podem ter seus valores alterados. Assinale a alternativa que cita uma vantagem da alocação de memória do tipo estático. Você acertou! A. Velocidade de acesso. Por serem fixas e permanentes, espera-se um maior uso de memória na alocação estática. A alocação não é feita em tempo de execução, e sim durante a compilação. Os endereços, uma vez definidos, não serão alterados, tampouco o tamanho da memória alocada. A velocidade de acesso é maior, já que os endereços são fixos e previamente conhecidos, constituindo esta uma vantagem. 3. Na alocação de memória dinâmica, o tamanho e o endereço a ser utilizado somente serão conhecidos pelo sistema no momento da execução. Assinale a alternativa que apresenta uma desvantagem desse tipo de alocação. Você acertou! A. Requer mecanismo de limpeza. A alocação dinâmica pode ocorrer de duas formas: pilha ou heap. Os dados são alocados em tempo de execução, o que torna a compilação mais rápida. É possível aumentar o tamanho de uma variável utilizando a alocação heap. Uma vez que muitas variáveis podem ser criadas em tempo de execução, é necessário implementar um sistema de limpeza, a fim de liberar espaço sempre que variáveis anteriormente alocadas se tornem inúteis, sendo esta uma desvantagem. 4. A alocação de memória dinâmica pode ser feita em modo pilha (stack) e em modo heap (monte). Apesar de não existir uma regra única, existem situações em que determinado tipo é mais benéfico que o outro. A pilha é a principal implementação quando se dá a alocação em virtude da(do): Você acertou! C. chamada de uma função. Valores constantes podem ser armazenados na memória estática, liberando espaço na memória dinâmica para outras variáveis, além de aproveitarem a maior velocidade de acesso nesse caso. Dentro da pilha, não é possível alterar o tamanho de uma variável em virtude do mecanismo de LIFO. Variáveis globais são utilizadas em diferentes escopos e não podem ser eliminadas, como no sistema LIFO. O carregamento do programa na memória durante a inicialização faz uso da memória estática, uma vez que é mais rápida e o programa não pretende ser alterado em tempo de execução. Já durante a chamada de uma função, espera- se que variáveis necessárias somente dentro daquele escopo sejam utilizadas, como os argumentos e dados de retorno, que poderão ser eliminados da memória tão logo a função retorne. 5. Normalmente, a pilha apresenta um tamanho previamente definido e que, se ultrapassado, resultará em uma exceção conhecida como stack overflow (ou “estouro de pilha”). Qual das alternativas a seguir apresenta uma forma de reduzir as ocorrências de stack overflow? Você acertou! A. Manter somente a referência ao objeto na stack. Ao fazer uso de argumentos de tamanho flexível, caso o sistema tente usar a pilha para essa finalidade, pode ser alocado um espaço menor que o necessário e, quando a variável aumentar, ocorra a sobreposição de dados, podendo inclusive superar o próprio tamanho da pilha. Os argumentos das funções costumam ser armazenados em uma pilha junto a outros valores, como os dados temporários, os endereços de referência para retorno, os valores de retorno, entre outros. Assim, a quantidade e o tamanho desses argumentos impactam diretamente no tamanho da pilha. Chamadas consecutivas, sem retorno, seja por instrução recursiva, seja por aninhamento de múltiplas funções, podem fazer com que a pilha precise armazenar mais dados que o comportado. Para cada chamada, um novo conjunto de dados é armazenado, o qual somente será eliminado ao retornar da função. Assim, variáveis muito grandes devem ser passadas como argumento, e a pilha pode ser utilizada para armazenar apenas um ponteiro para essa variável e alocar os dados em si na memória heap. Portanto, uma maneira de reduzir as ocorrências de stack overflow consiste em manter somente a referência ao objeto na stack. Organização de memória - Compiladores Exercícios