LINUX.ORG.RU

[C] malloc

 


0

0

Вчера начитался ЛОРа и написал вот такую программу:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[])
{
    unsigned int size;
    void* ptr;


    size = 1024 * 1024 * 1024;

    if ((ptr = (void*) malloc(size)) == NULL)
    {
        printf("Error due to initial memory allocation\n");
        exit(1);
    }

    memset(ptr, 0, size);
    printf("Allocated %d bytes\n", size);

    // Lets play a little game
    while (1)
    {
        printf("> ");
        scanf("%d", &size);
        if (size == 0)
        {
            break;
        }

        if ((ptr = realloc(ptr, size)) == NULL)
        {
            printf("Error due to memory allocation\n");
        }

        memset(ptr, 0, size);
        printf("Allocated %d bytes\n", size);
    }

    printf("Memory freed\n");
    free(ptr);
    exit(0);
}

Сутра показал другу, а он спросил меня как я дошел до такого :)

В процессе написания было замечено, что сразу после malloc память по показаниям не используется, а вот после заполнения ее уже заметно. Почему так происходит?

Что улучшить, на что бросить свои силы дальше?

Ответ на: комментарий от Boy_from_Jungle

Скорее разжеванные, такие кушать приятно. Прям как детское питание.

balodja ★★★
()
Ответ на: комментарий от limux

я хотел сказать что эта книга просто переведённые маны, ИМХО.

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от Boy_from_Jungle

>> И это будет не анонимный маппинг.

с помощью /dev/zero или /dev/null?!

Попробуй мапить /dev/null и расскажи нам о результатах.

tailgunner ★★★★★
()
Ответ на: комментарий от Boy_from_Jungle

>>Попробуй мапить /dev/null и расскажи нам о результатах.

а зачем?!

Я вот считаю, что мапить /dev/null нельзя. Мне интересно, прав ли я.

Кстати, какой из файлов (/dev/zero или /dev/null) является анонимным.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Я вот считаю, что мапить /dev/null нельзя. Мне интересно, прав ли я.

Вроде прав

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от tailgunner

Блин, ну вы бы хоть man mmap прочитали:


MAP_ANONYMOUS The mapping is not backed by any file; [...] The fd and offset arguments are ignored;

Раньше этого флага не было, использовали /dev/zero. Теперь ему не нужны эти аргументы.

Не существует никаких «анонимных файлов», ни единого.

да не существует, это народ уже придумал.

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от Boy_from_Jungle

> Раньше этого флага не было, использовали /dev/zero.

такого, вроде бы, никогда не было, но это неважно.

конечно, никаких анонимных файлов нету.

man mmap может немного запутать,

MAP_ANONYMOUS
The mapping is not backed by any file

это не совсем так. имеется в виду, что fd игнорируется.
но если у нас mmap(MAP_ANONYMOUS | MAP_SHARED) то будет
использоваться /dev/zero (даже если его нет).

malloc() делает MAP_ANONYMOUS | MAP_PRIVATE, и никакой
файл не используется. brk() - это просто mmap(). ну,
почти, в качестве addr используется mm->brk.

idle ★★★★★
()
Ответ на: комментарий от idle

> такого, вроде бы, никогда не было

На линуксе. ))

LamerOk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.