【问题标题】:Find available memory after address returned by malloc在 malloc 返回地址后查找可用内存
【发布时间】:2016-07-11 16:07:42
【问题描述】:

所以我写了这个(实际上是想看看 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 版本的源代码,甚至可以自己编写(或制作一些标准版本的私人副本),但除此之外,没有任何保证。
  • 然后试着找出我的地址所属的内存块的大小?

标签: c linux dynamic-memory-allocation realloc


【解决方案1】:

malloc_usable_size() 返回可以分配给指针的可用字节数

【讨论】:

  • 我不认为这是正确的,因为如果我在将内存分配给 x 之后 printf 它会显示“24”,我可以重新分配多达 135000 字节给它。
  • 如果同一个块中没有足够的可用空间,realloc 将数据复制到另一个块中
  • 我知道,但是在我的代码中,当这种事情发生时,for 会中断。所以我知道在此之前它没有被复制到另一个块,该块只是扩展了。 malloc_usable_size() 返回分配给指针的可用内存,而不是可以分配给指针多少,这是我所要求的。不过谢谢!
【解决方案2】:

这真的很棘手。看看下面的代码。特别是我正在使用 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;
}

【讨论】:

    猜你喜欢
    • 2011-08-09
    • 2017-02-24
    • 2013-06-04
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    • 2014-09-06
    相关资源
    最近更新 更多