4

メモリ内にある大量のデータを移動したい。残念ながら、このデータは配列として保存されており、それを変更することはできません。変更したくないいくつかの fortran メソッドでも同じメモリが使用されているため、循環配列を使用できません。その上、配列は移動の合間に非常に頻繁にアクセスされます。だから私はこれを行うことができます:

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);

これはうまくいくはずですが、無駄に見えます;)。縮小する配列の左側にあるデータを削除するようにコンパイラに指示できた場合、データはメモリを通り抜けますが、コピーを行う必要はありません。このような:

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);

したがって、基本的には、 へのポインターで終了し、array+1残りの 4 バイトを解放したいと考えています。free()andで遊んでみましmalloc()たが、うまくいきませんでした... realloc によっても memcpy 呼び出しが発生する可能性があることは承知していますが、毎回ではありません! だから、もっと速いかもしれませんよね?

4

2 に答える 2

5

いいえ。割り当てたメモリの下部を返す方法はありません。また、不確定なメモリをコピーしているため、元のコードが間違っています。

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は不確定を意味します。

于 2010-10-01T18:18:52.137 に答える
3

単純に要素を 1 つずつコピーしてみませんか?

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

または、memmoveこれまでと同じように使用しますが、再配置は必要ありません

#define NELEMS 5
memmove(array, array + 1, (NELEMS - 1) * sizeof *array);
array[NELEMS - 1] = 0;
于 2010-10-01T20:16:21.533 に答える