-1
a = sbrk(20*1024*1024+8192);
        a=(int *)((((int)a>>13)<<13)+8192);
    gettimeofday(&start,NULL);
    ARRAY_SIZE = 20*1024*1024+8192;
    for (times=0; times<SOME_LARGE_NUMBER; times++){
            for (i=0; i<ARRAY_SIZE; i=i+SOME_ACCESS_SIZE){
                         dummy=a[i];
                 }
    } 

显然我得到了上面代码的浮点异常,这是因为 ARRAY_SIZE 是 20mb,我怎么不会得到段错误或浮点异常但仍然有 20mb 的大小。

4

2 回答 2

1

有很多问题:

  • 您没有展示如何a声明,因此我们不知道它的类型,也无法分析涉及它的表达式是如何计算的。
  • sbrk是一个过时的电话。除特殊情况外,malloc应改为使用。
  • 该语句a=(int *)((((int)a>>13)<<13)+8192);尝试与a8192 字节的倍数对齐,但至少应该使用uintptr_t而不是int.
  • to 的参数sbrk是字节数,但(int *)演员表建议a是指向int. 在任何情况下,您都应该将分配乘以sizeof *a.
  • a对齐到 8192 字节的倍数之后,在它之后不再有20*1024*1024+8192可用的字节,因为其中一些已用于对齐。YetARRAY_SIZE设置为20*1024*1024+8192并在循环中使用,从而确保数组将被溢出。可能,ARRAY_SIZE应该设置为20*1024*1024.
于 2012-12-12T02:12:08.240 回答
0

您正在分配一个20*1024*1024+8192 字节长的内存块,然后将其视为20*1024*1024+8192 ints数组。请尝试以下操作:

ARRAY_SIZE = (20*1024*1024+8192) / sizeof(int);
于 2012-12-12T02:12:03.660 回答