Pergunta

Quero mover um grande pedaço de dados que tenho na minha memória. Infelizmente, esses dados são salvos como uma matriz, e não posso mudar isso. Não posso usar matrizes circulares, porque a mesma memória também é usada por alguns métodos fortran que não quero mudar. Além disso, as matrizes são acessadas com muita frequência entre o movimento. Então eu posso fazer isso:

int *array = (int*) malloc(sizeof(int)*5);
int *array2=NULL;
//Now i want to move my data one step to the left
array=(int*) realloc(array,6);
array2=array+1;
memmove(array,array2,5*sizeof(int));
array=(int*) realloc(array,5);

Isso deve funcionar bem, mas parece tão desperdiçado;). Se eu pudesse dizer ao meu compilador para retirar os dados no lado esquerdo de uma matriz em encolhimento, meus dados iriam rastejar pela memória, mas eu não precisaria fazer nenhuma cópia. Assim:

int *array = (int*) malloc(sizeof(int)*5);
//Now i want to move my data one step to the left
array=(int*) realloc(array,6);
array=(int*) realloc_using_right_part_of_the_array(array,5);

Então, basicamente, eu quero terminar com um ponteiro para array+1, com o 4 byte à esquerda libertado. Eu brinquei com free() e malloc() Mas não funcionou ... Estou ciente de que o RealLoc também poderia resultar em uma chamada de memcpy, mas não sempre! Então poderia ser mais rápido, não poderia?

Foi útil?

Solução

Não. Não há como devolver a parte inferior da memória que você alocou. Além disso, seu código original está errado, pois você está copiando memória indeterminada.

int *array = (int*) malloc(sizeof(int)*5);
// Fill memory:
// array - {'J', 'o', h', 'n', '\0'}; 
int *array2=NULL;
//Now i want to move my data one step to the left
array=(int*) realloc(array,6);
// array - {'J', 'o', h', 'n', '\0', X};
array2=array+1;
// array2 pointer to 'o of array.
memmove(array,array2,5*sizeof(int));
// This copies the indeterminate x:
// array - {'o', h', 'n', '\0', X, X}
array=(int*) realloc(array,5);
// array - {'o', h', 'n', '\0', X}

X significa indeterminado.

Outras dicas

Por que você simplesmente não copia os elementos um por um?

#define NELEMS 5
for (i = 0; i < NELEMS - 1; i++) {
    array[i] = array[i + 1];
}
array[NELEMS - 1] = 0;

ou, use memmove Como você tem feito, mas sem a realocação

#define NELEMS 5
memmove(array, array + 1, (NELEMS - 1) * sizeof *array);
array[NELEMS - 1] = 0;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top