5

我正在尝试使用以下程序以编程方式了解缓存的效果。我的代码出现段错误。我使用了 GDB(用 编译-g -O0),发现它是分段错误的

start = clock() (first occourance)

难道我做错了什么?代码对我来说看起来不错。有人可以指出错误吗?

#include <stdio.h>
#include <sys/time.h>
#include <time.h>
#include <unistd.h>

#define MAX_SIZE (16*1024*1024)
int main()
{
    clock_t start, end;
    double cpu_time;
    int i = 0;
    int arr[MAX_SIZE];

    /* CPU clock ticks count start */
    start = clock();

    /* Loop 1 */
    for (i = 0; i < MAX_SIZE; i++) 
        arr[i] *= 3;

    /* CPU clock ticks count stop */
    end = clock();

    cpu_time = ((double) (end - start)) / CLOCKS_PER_SEC;

    printf("CPU time for loop 1 %.6f secs.\n", cpu_time);

    /* CPU clock ticks count start */
    start = clock();

    /* Loop 2 */
    for (i = 0; i < MAX_SIZE; i += 16) 
        arr[i] *= 3;

    /* CPU clock ticks count stop */
    end = clock();

    cpu_time = ((double) (end - start)) / CLOCKS_PER_SEC;

    printf("CPU time for loop 2 %.6f secs.\n", cpu_time);

    return 0;
}
4

2 回答 2

8

数组对于堆栈来说可能太大了。尝试制作它static,以便它进入全局变量空间。作为额外的奖励,static变量被初始化为全零。

与其他类型的存储不同,编译器可以在编译时检查全局资源是否存在(并且操作系统可以在程序启动之前在运行时进行双重检查),因此您不需要处理内存不足错误。未初始化的数组不会使您的可执行文件变大。

这是堆栈工作方式的一个不幸的粗糙边缘。它位于一个固定大小的缓冲区中,由程序可执行文件的配置根据操作系统设置,但很少根据可用空间检查其实际大小。

欢迎来到 Stack Overflow 土地!

于 2013-06-16T22:21:31.333 回答
4

尝试改变:

int arr[MAX_SIZE];

至:

int *arr = (int*)malloc(MAX_SIZE * sizeof(int));

正如 Potatoswatter 建议的那样The array might be too big for the stack......您可能在堆上分配,而不是在堆栈上......

更多信息

于 2013-06-16T22:24:38.273 回答