Hoje é segunda-feira, 6th fevereiro 2012

Arquivo para o ‘C/C++’ Categoria

Dicas de Otimização: Alocação dinâmica de memória para uma Matriz

É 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&lt;m; i++) {
matriz[i] = (int*) malloc( m * sizeof(int) );
}
 
//LIBERAÇÃO DA MEMÓRIA
for( int i=0; i&lt;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&lt;m; i++) {
matriz[i] = &amp;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.