所以我写了这个(实际上试图看看realloc是否是O(n)-ish或不是):
int main() {
time_t t1,t2;
char* x=malloc(sizeof(char));
char* y=x;
printf("%p %p\n",(void*)x,(void*)y);
double tot_time=0.0;
double time_r=0.0;
size_t s=2;
for(;;s++) {
t1=clock();
x=realloc(x,s*sizeof(char));
t2=clock();
if(x!=y) break;
time_r=difftime(t2,t1)/CLOCKS_PER_SEC;
//printf("%p %p %zu %f secs\n",(void*)x,(void*)y,s,time_r);
tot_time+=time_r;
}
printf("%zu elements %f secs\n",s,tot_time);
return 0;}
具有不断递增的大小(按1个字节)重新分配由malloc在开始时返回的内存,直到返回不同的地址。当这样的事情发生时,它会告诉你在malloc返回的初始地址之后可以分配多少内存。
我的问题是:在运行Linux的机器上(在我的情况下是Ubuntu 14.04 64bits)有什么方法可以预先知道x扩展了多少内存?
答案 0 :(得分:0)
这真的很棘手。看看下面的代码。特别是我正在使用 malloc_usable_size显示上次调用realloc时实际分配的内容。
这也不会考虑应用程序可能具有的任何影响,即某些影响 应用程序将在某些范围内分配比其他更多的块,具体取决于 realloc的实现可能会对性能产生很大影响。
在大多数情况下,Realloc不会复制数据,即它不会被强制为至少O(n)它通常会调整指针。当它必须复制数据时,它最好是O(n),但这将由应用程序确定。
#include <assert.h>
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int main(void) {
time_t t1;
time_t t2;
double tot_time = 0.0;
double time_r = 0.0;
size_t s = 2;
char *x = malloc(sizeof(char));
char *y = x;
printf("%p %p\n",(void*)x,(void*)y);
for(;;s++) {
t1 = clock();
printf("s=%zu usable=%zu\n", s, malloc_usable_size(x));
x = realloc(x, s * sizeof(char));
assert(x != NULL);
t2 = clock();
if( x != y) {
break;
}
time_r = difftime(t2, t1) / CLOCKS_PER_SEC;
//printf("%p %p %zu %f secs\n",(void*)x,(void*)y,s,time_r);
tot_time += time_r;
}
printf("%zu elements %f secs\n", s, tot_time);
return 0;
}
答案 1 :(得分:0)
malloc_usable_size()返回可分配给指针的可用字节数