5

[10000、1000000]の範囲のサイズのランダムなfloatを含むAという名前の配列があります。この配列は私の関数に対してランダムに生成された引数であり、それを操作するために、効率的な方法で10000個のゼロをプリエンプティブに追加/パディングしようとしています。Aに割り当てられたメモリを追加するとヒープが破損するのではないかと心配しているので、代わりに新しいメモリ、memcopy A、および新しい配列のmemset10000末尾のfloatを0.0に割り当てます。

void *ArrayPadder(float *A){
    int pad = 10000;
    float *Apadded = (float*)malloc((sizeof(A)+pad)*sizeof(float));
    memcpy(Apadded, A, sizeof(A));
    memset(Apadded+sizeof(A), 0.0, pad);
    return Apadded;
}

誰かがこれを達成するためのより効率的な方法を提案できますか?

編集:遅延についてお詫びしますが、いくつかの説明を追加しました。正しいメモリスペース(510000フロート)を事前に割り当てることができない理由は、配列が実際にはランダムなサイズであり、ランダムなフロートを含んでいるためです。質問を単純化するために500000を選択しましたが、現在は修正されています。

4

4 に答える 4

6

実際にはより効率的な方法ではありませんが、より正確な方法です。

memset(Apadded+sizeof(A), 0, pad * sizeof(float));

floatのサイズが4であるかのように、コードは最初のコードのみを初期化しますpad / sizeof(float) = 10000 / 4 = 2500 elements

intを取り、その(下位バイト)値をすべてのバイトに設定するため、2番目のパラメーターとしてでは0なくを使用したことに注意してください。0.0memset

于 2012-11-01T20:54:53.940 に答える
3

10000個のゼロを効率的に追加/パディングしようとしています

追加とパディングは必ずしも同じものではありません。既存のメモリチャンクを10,000要素増やしたいと思います。

正しいサイズを前もって割り当てて、それで済ませてみませんか?

#define BASE_SIZE 500000
#define PAD_SIZE  10000

/* ... */

float *data = malloc((BASE_SIZE + PAD_SIZE) * sizeof(float));
if(!data) {
    /* do something */
}

memset(data + BASE_SIZE, 0, PAD_SIZE * sizeof(float));
/* last PAD_SIZE elements are now 0 */

また、要素ではなく、設定するバイトmemset数が必要であることに注意してください。したがって、次のようになります。

memset(Apadded+sizeof(A), 0.0, pad);

間違っている。する必要がありますpad * sizeof(float)padは要素の数であり、要素sizeof(float)あたりのバイト数を示します。

于 2012-11-01T20:57:22.140 に答える
2

これAは、定義方法によって異なります。ヒープに割り当てられている場合は、次を使用してrealloc()ください。

Apadded = realloc(A, new_size);
于 2012-11-01T20:54:26.233 に答える
0

ジョーダン、あなたのコードにはいくつかの問題があります。A定義方法は示されていませんがsizeof(A)malloc呼び出しでの使用は間違っている必要があります。拡張メモリを割り当てるには、、またはのいずれかがmalloc必要callocですrealloc。 がヒープ上に(mallocなどによって)割り当てられたメモリ領域へのポインタでreallocある場合にのみ使用できます。A

float *Apadded = realloc(A, (number_of_entries_in_A + pad) * sizeof(float));

reallocの内容をコピーしますがAApaddedパディング領域は初期化されません。realloc失敗する可能性があることに注意してください。その場合Aはまだ存在し、後で解放する必要があります。

A静的に割り当てられた場合は、mallocまたはが必要callocです。 callocはメモリをゼロに初期化しますが、AをApappedにコピーするので、無駄です。だからmalloc最高でしょう。

float *Apadded = malloc((number_of_entries_in_A + pad) * sizeof(float));

number_of_entries_in_Aと同じではないことに注意してくださいsizeof(A)。また、Cでのキャストはありません。

memsetパディング領域を初期化するには、で使用できますsizeof(A)。ただし、がポインタの場合、配列ではなくポインタのサイズとA同様に失敗することに注意してください。sizeof(A)

memcpy(Apadded, A, sizeof(A));
memset(Apadded+sizeof(A), 0, pad);

また、おそらくそうですが、浮動小数点0.0がすべてゼロで表されるという保証はない場合があることにも注意してください。

于 2012-11-01T23:12:34.807 に答える