×
Namespaces

Variants
Actions
Revision as of 19:03, 9 December 2011 by lpvalente (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Gerência de memória

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata

Compatibilidade
Plataforma(s):
Symbian

Artigo
Criado por cabezonxdg em 27 May 2007
Última alteração feita por lpvalente em 09 Dec 2011

Contents

Introdução

Um dos maiores benefícios do SymbianC++ está em sua performance quando comparada a outras linguagens de programação como Java, Python e outras. Este benefício trás seus contra-pontos, não existe um gestor de recursos para automatizar a gerência de recursos e por isso cabe ao programador realizá-lo de forma manual.

A memória é um dos recursos mais limitados nos dispositivos móveis devido a uma série de fatores relacionados a redução de custos, consumo de energia, tamanho do dispositivo entre outros. Por esse motivo os programas devem gerenciar recursos do sistema de forma com que estes não sejam disperdiçados.

Boas práticas de programação

Boa maneiras para gerênciar recursos de memória são:

  • Programe eficientemente evitando o uso desnecessário da memória RAM;
  • Libere os recursos assim que não utilizá-los mais (lembre-se que eles são limitados);
  • Ao ocorrer uma falha de memória em sua aplicação deve-se gerenciá-la e voltar sua aplicação a um estado estavel.

Tipos de memória

Dois tipos de memória são utilizadas pelos programas a Stack e Heap

Stack

Stack são regiões da memória onde os dados são inseridos e removidos seguindo a estrutura de dados 'último que entrou primeiro que sai'. Objetos e varíaveis declaradas dentro do escopo de funções e métodos estão nessa região da memória.

Alocação de memória na stack é bastante simples e típicamente mais rápida que alocação na heap. Os dados na stack são desalocados automáticamentes uma vez que a função chegue ao fim de seu escopo, isto pode ser bastante eficiente para informações temporárias.

  • Objetos são deletados automáticamente ao fim do escopo da função.
  • Tamanho padrão em Symbian é de 8KB porém este valor pode ser aumentado através do arquivo de gerência do projeto (MMP).

Heap

  • Sempre que um objeto for alocado dinâmicamente ele precisa ser removido utilizando o operador delete , caso contrário ao sair de escopo a referência a memória que ele aponta será perdida ocasionando um vazamento de memória
  • O tamanho da Heap depende do dispositivo mas normalmente é > 0.5MB (512KB).

Gerência de memória no Symbian OS

Abandonos (Leave)

  • Abandonos são utilizados ao invés das exceções em C++.
  • Quando ocorre uma falha em tempo de execução o código "abandona".
  • O operador new foi sobrecarregado para abandonar durante a instancialização de objetos caso a memória não seja suficiente.
  • Utilize new (ELeave) ao invés do tradicional new.
  • A memória é liberada normalmente utilizando delete.
  • Funções que podem abandonar deve terminar em "L" , ex.: ConstructL, NewL para indicar ao programador esta ação.

Pilha de limpeza (Cleanup Stack)

A pilha de limpeza é utilizada para colocar objetos que executam chamadas a funções que podem abandonar. Se um objeto faz uma chamada a uma função e esta lançe um abandono a referência a memória do objeto será perdida e ocasionando um vazamento de memória. Ao colocar o objeto na pilha de limpeza antes de chamar a função com possibilidade de abandono, a pilha irá gerenciar a limpeza de memória/recursos deste objeto em uma eventual falha.

  • A não utilização da pilha de limpeza pode deixar brechas na memória.
  • Apenas objetos locais - que estão na stack - (objetos que são atributos de classes nunca vão para a pilha) vão para a pilha de limpeza.
  • Caso ocorra uma falha na execução de uma função chamada pelo objeto, seus recursos serão liberados, seu ponteiro deletado e será removido da pilha de limpeza.
  • Após executar o código que pode gerar abandono o objeto deve ser liberado da pilha através da funçãoCleanupStack::Pop().
  • Objetos podem ser liberados da pilha e deletados ao mesmo tempo. CleanupStack::PopAndDestroy();

Construção em duas fases

Construtor em 2 fases

  • Construtores padrão C++ não devem chamar funções que possam abandonar.
  • Qualquer alocação dinâmica de memória bem como a execução de códigos que possam abandonar durante a construção do objeto devem ser colocados em um construtor especial chamado de Contrutor de Dois Passos, por convenção atribui-se a essa função o nome de ContructL
This page was last modified on 9 December 2011, at 19:03.
62 page views in the last 30 days.
×