0

Cでこれを行うための最適かつ最適化された方法を使用して、それぞれのサイズが10000000のcharポインターの配列を作成する必要があります。

4

4 に答える 4

4

これでうまくいくと思います(ただし、nullをチェックしていません):

int i;
int num_arrays;
char **huge_char_array;
num_arrays = 10; //number of arrays you want.
huge_char_array = (char **)malloc(sizeof(char *) * num_arrays);
for(i = 0; i < num_arrays; i++)
{
    huge_char_array[i] = (char *)malloc(sizeof(char) * 10000000);
}
于 2012-08-10T19:48:03.110 に答える
2

動的割り当てが 1 つしかなく、ヒープの断片化によるオーバーヘッドと割り当てにかかる時間が削減されるため、これが最適な方法だと思います。STRING_INDEX ユーティリティ関数を使用して、n 番目の文字列にアクセスできます。

また、malloc() の代わりに calloc() を使用すると、バッファがゼロになり、すべての文字列が NUL で終了することが保証されます。

#define STRING_SIZE 10000000
#define NUM_STRINGS 10

#define STRING_INDEX(array, string_idx) ((array) + (string_idx) * STRING_SIZE)

int main(int argc, char **argv) {
    char *array_of_strings = calloc(NUM_STRINGS, STRING_SIZE);

    // Access 8th character of 7th string
    char c = STRING_INDEX(array_of_strings, 7)[8];

    // Use array

    // Free array when done
    free(array_of_strings);

    return 0;
}
于 2012-08-10T19:53:41.503 に答える
1

リクエストごとに50Kを割り当てていますが、これによりメモリが断片化されました。そこで、50k * 100 = 5MBを割り当てるように切り替え、もう1つ割り当てる必要がある場合はいつでもプールを再利用します。リクエストがプール容量を超えて増加した場合は、メモリの断片化を避けるためにプールサイズを2倍にします。これに基づいて、おそらくあなたの場合は10 * 10000000のメモリの巨大なチャンクを割り当てて、それを再利用することをお勧めします。申し訳ありませんが、ここでプールを処理するコードを共有することはできません。また、mallocとfreeを使用し、newとdeleteは使用しないでください。

mallocは例外を通過せず、使用可能なメモリがない場合は単にnullを返します。

要素ごとにmallocを個別に使用する場合は、断片化を回避するために最大サイズのヒープを作成できます。その場合は、ヒープサイズを定義する必要があります。

ヒープを作成して使用する方法、またはWindowsユーザーが使用できるその他の割り当て方法の詳細については、MSDNを参照してください。 http://msdn.microsoft.com/en-us/library/windows/desktop/aa366533(v=vs.85).aspx

于 2012-08-10T19:49:52.800 に答える
1
char *arr[SOME_SIZE];
for(int i = 0; i < SOME_SIZE; ++i) {
    arr[i] = malloc(10000000);
    if(!arr[i])
        // allocation failed, do something
}

配列内のすべての要素(つまり、SOME_SIZE * 10000000合計バイト数)に最大 9.5MB を割り当てていることに注意してください。

于 2012-08-10T19:46:36.093 に答える