内存管理器库:静态或DLL / SO

时间:2011-12-10 10:29:32

标签: c++ memory cross-platform

我目前正在开发跨平台C ++游戏引擎(Windows,Mac,Ubuntu)。我已经写完了一个内存管理器模块,我希望其他模块可以使用。理想情况下,应该只有一个CMemoryManager类的实例来监督所有分配器(堆,竞技场等......)然后在工厂中将其传递给其他模块(输入,图形内容管理器等)的管理器方法

我应该如何共享内存模块?将CMemoryManager的实例传递给DLL进行所有内部分配是危险的吗?有什么风险,我该如何避免它们?我使用DLL / SO作为内存模块(而不是静态lib / archive)的原因是我想动态加载内存模块。通过这种方式,我可以分析各种实现,并可能在将来发布更高效的版本。

例如,

// Win32 Version
Result Engine::LoadModules()
{
    HRESULT input_library = LoadLibrary(input_library_path);
    if(input_library == NULL)
    {
        return Result::Failure(L"InputLibrary Failed To Load");
    }

    InputFactoryFuncPtr InputFactoryFunction;
    InputFactoryFunction = (InputFactoryFuncPtr)GetProcAddress(input_library,"MakeFactory");

    input_factory = InputFactoryFunction(memory_manager,...);
    if(input_factory == NULL)
    {
        return Result::Failure(L"InputLibrary::MakeFactory Failed");
    }

    // The input_factory allocates memory using the memory_manager here.
    keyboard = input_factory.create_keyboard();

    return Result::Success;
}

换句话说,是否存在与传球相关的风险?跨DLL边界使用内存管理器实例?

1 个答案:

答案 0 :(得分:0)

“只应该有一个CMemoryManager类的实例”这听起来像Singleton Pattern。回到核心问题,听起来像Plugin架构是你需要的。我会使内存管理器类和所有其他模块动态文件具有不同的类型 即

typedef enum {PLUGIN_TYPE_MEMMGR, PLUGIN_TYPE_NORMAL}PType;

然后在插件的构造函数中传递类型(以后可以有多个内存管理器)。然后会有一个插件管理器,它将由引擎创建,并将成为传递给每个插件的另一个参数。管理器应该只有一个具有MEMMGR类型的插件实例(您可以将其扩展为将来有多个代码更改)。插件管理器应该是一个单独的插件,以便每个插件都具有相同的内存管理器实例。

class PManager{
public:
  PManager(){
     m_memoryManager = LoadPluginSomeHow(PLUGIN_TYPE_MEMMGR);
  }
  CMemoryManager* GetMemoryManager(){
   return m_memoryManager;
}
//other code to do task

private:
  CMemoryManager* m_memoryManager;
};

我无法更好地解释,可能会编辑和添加信息,但您可以通过阅读this thread

来了解相关信息