数据分配

时间:2013-07-25 11:20:54

标签: c dynamic-memory-allocation calloc

我正在研究一个程序,使用Calloc()计算时间, 该程序应该尝试分配50megs并每次迭代50次meg, 直到它分配了1500兆公羊。 createbigthing()的目标只是创造一些大的东西并释放它。

....
#define oneMeg 1024L*1024L
#define INCREMENT 50

int difftod(struct timeval * tv0, struct timeval * tv1){
return (tv1->tv_sec - tv0->tv_sec)*1000 + (tv1->tv_usec- tv0->tv_usec)/1000;
}


int createbigthing(long int size){

int *test = (int*) calloc(size, (size_t) oneMeg);
if(test == NULL){
    return -1;
}

free(test);
return 0;
}


int main(){
long int i;
int rtn;
struct timeval tv0, tv1;
struct timezone tzp;
for(i=INCREMENT;i<=1500;i=i+INCREMENT){
        rtn = gettimeofday(&tv0, &tzp); /* set timer T0 */
        createbigthing(i);
    rtn = gettimeofday(&tv1, &tzp); /* read time T1 */
    printf("%d msec\n",difftod(&tv0,&tv1));
}
return 0;
}

我得到的唯一输出是第一次迭代给了我大约220毫秒的延迟然后什么都没有,函数仍然返回0所以内存不应该是满的。

输出示例:

220 msec
0 msec
0 msec
0 msec
0 msec
...

1 个答案:

答案 0 :(得分:0)

这完全是预期的行为:

  • 您从系统内核请求一个Mebibyte(在calloc()内),这需要时间(但不应该是220毫秒)。

  • 你释放了这个内存,告诉libc(而不是内核)你不再需要它了。在大多数情况下,libc不会将内存返回给系统,因此它仍然是虚拟地址空间的一部分。

  • 你再次告诉libc,你需要一个Mebibyte的RAM,并且libc说:哦,太棒了,我还有一个很合适的块。接受!它也会删除它的内容,因为你使用calloc(),但这不会花费毫秒的时间。

另请注意,您的时间差分代码将向下舍入低于一毫秒的任何时差。您可能希望将其更改为打印经过的微秒。