Я пытаюсь сделать функцию, которая выделяет память в блоках, а затем в состоянии назначить указатель памяти для различных структур, связанных друг с другом.
#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, возникает много накладных расходов, и это огромная проблема, поскольку дерево состоит из миллионов узлов.
Эта часть кода имеет проблему
if(( memptr+size+1 >= memstart+MEMSIZE) )
tmp = AddBlock();
потому что это не продвигает memptr по размеру.
Других решений пока нет …