Библиотека диспетчера памяти: статическая или DLL / SO - PullRequest
1 голос
/ 10 декабря 2011

В настоящее время я работаю над кроссплатформенным игровым движком C ++ (Windows, Mac, Ubuntu).Я закончил писать модуль менеджера памяти, который хотел бы использовать другие модули.В идеале должен быть только один экземпляр класса CMemoryManager, который наблюдает за всеми распределителями (кучами, аренами и т. Д.). Затем он передается менеджерам из других модулей (входные данные, менеджер графического содержимого и т. Д.) На их фабрикеМетоды.

Как я должен разделить модуль памяти?Будет ли передача экземпляра CMemoryManager в DLL для всех его внутренних распределений опасно?Каковы риски и как их избежать?Моя причина использования DLL / SO для модуля памяти (в отличие от статической библиотеки / архива) заключается в том, что я хотел бы динамически загружать модуль памяти.Таким образом, я могу профилировать различные реализации и, возможно, выпустить более эффективные версии в будущем.

Например,

// 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 голосов
/ 10 декабря 2011

"должен быть только один экземпляр класса CMemoryManager". Это звучит как шаблон Singleton.Вернемся к основному вопросу. Похоже, вам нужна архитектура плагинов.Я бы сделал и класс менеджера памяти и все другие модули динамическими файлами с другим типом, т.е.

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;
};

Я не в состоянии объяснить лучше, может быть, я буду редактировать и добавлять информацию, но вы можетеесть идея, прочитав эту тему

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...