【问题标题】:Allocate memory for huge node tree dynamically为巨大的节点树动态分配内存
【发布时间】:2013-05-14 04:34:50
【问题描述】:

我正在尝试创建一个以块为单位分配内存并且能够为链接在一起的不同结构分配内存指针的函数。

#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();
}

memptrmemstartextern 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 为每个结构分配内存时,会有很多开销,这是一个巨大的问题,因为树由数百万个节点组成。

【问题讨论】:

  • 你有什么问题?内存分配是一个巨大的话题,你甚至还没有定义你的用例。对于初学者,您是否需要释放单个节点?您是否需要处理不同大小的分配?典型的分配大小是多少?等
  • 是的,它们的大小不同,但不必释放。典型的分配大小约为 16 - 88 size_t。
  • 您的代码在我看来是合理的。您唯一没有处理的是对齐。
  • 我添加了一个填充,以便 mempr 总是增加 8 size_t 的倍数(64 位系统)。那应该可以解决对齐问题吗? tmp = 添加块(); int padding = size%8; mempr+=size+padding;

标签: c++ c memory-management malloc calloc


【解决方案1】:

这段代码有问题

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

因为它没有按大小推进 mempr。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-08
    • 2012-12-21
    • 2012-06-22
    • 2016-08-30
    • 1970-01-01
    • 2012-12-30
    • 2013-04-14
    • 2023-03-03
    相关资源
    最近更新 更多