2016-03-24 5 views
1

Так что я написал это (на самом деле пытается увидеть, если перераспределить была О (п) -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;} 

Какой reallocs с постоянно увеличивающимся размером (от 1 байт) память, возвращаемая malloc в начале, пока не будет возвращен другой адрес. Когда это произойдет, он расскажет вам, сколько памяти было возможно выделить после этого начального адреса, возвращаемого malloc.

Мой вопрос: на машине под управлением Linux (в моем случае Ubuntu 14.04 64bits) есть ли способ узнать перед собой, сколько памяти, на которую указывает x, расширяется?

+2

Это зависит от реализации. Вы можете прочитать исходный код для версии «malloc», которую используете, или даже написать свой собственный (или сделать частную копию некоторой стандартной версии), но кроме этого нет гарантий. –

+0

И попытаться найти размер блока памяти, к которому принадлежит мой адрес? – CrossNox

ответ

0

Это действительно сложно. Посмотрите на код ниже. В частности, я использую malloc_usable_size для отображения того, что на самом деле было выделено в последний раз, когда был вызван 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; 
} 
0

malloc_usable_size() не возвращают не годных байтов, которые могут быть выделены для указателя

+0

Я не думаю, что это правильно, так как если я распечатаю его после выделения памяти на x, он говорит «24», и я могу перераспределить до 135000 байт. – CrossNox

+0

realloc копирует данные в другой блок, если в одном блоке недостаточно свободного места – Mukesh

+0

Я знаю это, но в моем коде для разрывов, когда такое происходит. Поэтому я знаю, что до этого он не копировался в другой блок, блок просто расширялся. malloc_usable_size() возвращает полезную память, выделенную указателю, а не то, сколько может быть выделено указателю, и это то, о чем я просил. Спасибо хоть! – CrossNox

 Смежные вопросы

  • Нет связанных вопросов^_^