Выделите память для огромного дерева узлов динамически

Я пытаюсь сделать функцию, которая выделяет память в блоках, а затем в состоянии назначить указатель памяти для различных структур, связанных друг с другом.

#define MEMSIZE 50*1024*1024*sizeof(char)
#include "globals.h"
void *AddBlock(void){
    memstart = (char*) calloc(1,MEMSIZE);
    if(memstart==NULL){
        printf("Hittade inte minne...:\n");
        getchar();
        throw 1;
    }
    memptr = memstart;
    return memstart;
}

void* GetSpace(size_t size){ //gör nytt block eller putta fram pekaren
                             //makes a new block or increases ptr

    void *tmp = NULL;//where the data should be stored
    if(( memptr+size+1 >= memstart+MEMSIZE) )
        tmp = AddBlock();
    else
    {
        tmp = memptr;
        memptr+=size;
    }
    return tmp;
}

void InitMem(void){ //init of memory globals
    AddBlock();
}

memptr а также memstart являются extern char*, memstart это начало блока и memptr это то, где вы находитесь InitMem находится в main по началу.

глобальные.h

extern char *memstart;
extern char *memptr;

глобальные.cpp

char *memstart;
char *memptr;

Например, struct Node* TheNode = GetSpace(sizeof(struct Node));

Но код работает очень плохо и дает много глюков в программе.

Есть ли какой-нибудь общий способ сделать это? Когда я выделяю память для каждой структуры с помощью malloc, возникает много накладных расходов, и это огромная проблема, поскольку дерево состоит из миллионов узлов.

1 ответ

Решение

Эта часть кода имеет проблему

if(( memptr+size+1 >= memstart+MEMSIZE) )
    tmp = AddBlock();

потому что это не продвигает memptr по размеру.

Другие вопросы по тегам