0

L2 キャッシュのサイズを測定する宿題をしようとしています。大きな配列 (キャッシュには大きすぎる) を作成して、ランダムな整数で埋めようとしています。次に、さまざまなステップ サイズで歩き回り、パフォーマンスのベンチマークを行います。

私が抱えている問題は、大きな配列にメモリを割り当ててから、1 から 100 までのランダムな整数で配列を埋め始めると、プログラムがクラッシュすることです (スタック オーバーフロー?)。

残念ながら、私はCプログラミングに非常に慣れていません。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char *argv[])
{
    int buffSize = sizeof(int) * 2000000;

    int * buff = (int*) malloc(buffSize);


    srand(time(NULL));

    for (int i = 0; i < buffSize; i++)
    {
        int r = rand() % 100 + 1;

        buff[i] = r;
    }

    return 0;
}
4

2 に答える 2

4
for (int i = 0; i < buffSize; i++)

あなたは行き​​過ぎです。が 2000000 まで上がるだけbufsizeです2000000 * sizeof(int)

于 2013-09-23T20:47:47.907 に答える
0

新しい配列を作成するのではなく、現在のアーキテクチャの int のサイズに基づいてメモリ ブロックを割り当てています。次に、それを配列として扱います。これは、c 配列とポインターがどのように機能するかによって機能します。

これを行うと、配列のウォークを開始しますが、配列の長さとメモリのサイズを混同してしまいます。各 int が 4 バイトの場合、サイズは です2000000 * 4が、長さは2000000. size/4これは、入力した各 int が 4 バイトを必要とするため、そのスペースに相当するアイテムしか収まらないためです。

必要に応じて、配列を作成するだけで malloc の問題が回避され、より明白になります。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char *argv[])
{
    int arr_length = 2000000;
    int arr[arr_length];

    srand(time(NULL));

    for (int i = 0; i < arr_length; i++)
    {
        int r = rand() % 100 + 1;

        arr[i] = r;
    }

    return 0;
}
于 2013-09-23T20:54:08.690 に答える