Arquivo para o ‘C/C++’ Categoria
Dicas de Otimização: Alocação dinâmica de memória para uma Matriz
Última atualização quinta-feira, 1 julho 2010 08:49 Escrito por Patrick Shinzato terça-feira, 8 junho 2010 09:37
É normal no mundo da programação, não importa a linguagem, trabalharmos com matrizes de dados. A forma de alocação de memória pode ser estática ou dinâmica, depende da linguagem. Esta dica, mostrará como otimizar uma alocação dinâmica de memória para uma matriz na linguagem C.
Pode parecer idiota postar uma dica assim, mas se a velocidade de execução do seu programa importa então você deve otimizar as funções que fazem chamadas de sistema, como alocação de memória, no SO. Imagine por exemplo trabalhar com um vídeo, onde temos que processar 30 imagens por segundo e cada imagem é uma matriz de pixels por exemplo.
Um programa simples de alocação de uma matriz de (mxn) seria assim:
// assuma que você já leu os valores dos inteiros <strong>m</strong> e <strong>n</strong> // ALOCAÇÃO DA MEMÓRIA int **matriz = (int**) malloc( m * sizeof ( int* ) ); for( int i=0; i<m; i++) { matriz[i] = (int*) malloc( m * sizeof(int) ); } //LIBERAÇÃO DA MEMÓRIA for( int i=0; i<m; i++) { free(matriz[i]); } free(matriz); |
Isso não é muito eficiente!
Se pudermos eliminar algumas chamadas de sistema (free e malloc) e o laço (for), ganharemos um pouco de desempenho. Para isso, que tal alocarmos apenas 2 vezes e liberamos também apenas 2 vezes?
// ALOCAÇÃO DA MEMÓRIA int *buffer = (int*) malloc( m * n * sizeof( int ) ); int **matriz = (int**) malloc( m * sizeof( int* ) ); for( int i=0; i<m; i++) { matriz[i] = &buffer[ i * m ]; } //LIBERAÇÃO DA MEMÓRIA free(buffer); free(matriz); |
Você pode achar que estamos gastando memória a mais, mas se você reparar bem, estamos usando apenas um ponteiro a mais.
Tags:Alocação Dinâmica, C, Programação | Postado sobre C/C++, Dicas, Programação | 1 Comentário