gpt4 book ai didi

c - 在 malloc 返回的地址后查找可用内存

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:25:17 25 4
gpt4 key购买 nike

所以我写了这个(实际上是想看看 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 64 位),有什么方法可以事先知道 x 指向的内存可以扩展多少?

最佳答案

这真的很棘手。看看下面的代码。特别是我正在使用malloc_usable_size 显示上次调用 realloc 时实际分配的内容。

这也没有考虑应用程序可能产生的任何影响,即一些应用程序将在某些范围内分配比其他范围更多的 block ,具体取决于realloc 的实现这会对性能产生很大的影响。

在大多数情况下,Realoc 不会复制数据,即它不会被强制至少为 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;
}

关于c - 在 malloc 返回的地址后查找可用内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36193893/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com