2015-02-21 6 views
0

Я работаю над большой старой кодовой базой, которая использует пулы памяти для отличной скорости. Проблема в том, что распределение и освобождение памяти через пул памяти сложнее. Я хотел бы попробовать использовать интеллектуальные указатели, но мне было предложено, чтобы потеря производительности была проблемой.Умный указатель памяти пула

Решение, которое, кажется, представляет собой реализацию интеллектуального указателя, которая продолжает использовать исходный пул памяти под капотом. Я не могу найти комбинации интеллектуальных указателей/пулов памяти. Может ли кто-нибудь указать мне пример реализации этого? Есть ли какие-либо проблемы/предостережения, о которых я должен знать, прежде чем пытаться это сделать?

ответ

1

Modern C++ Design У Андрея Александреску есть хорошая глава по умным указателям. Библиотека Loki, описанная в книге, содержит шаблоны, которые используют классы политик для настройки поведения интеллектуальных указателей на ваши конкретные потребности.

Знайте, это другой зверь, чем C++ 11's std::shared_ptr, и несовместимы с ними. Включение Loki в вашу кодовую базу не может быть оправданным выбором, в зависимости от ваших потребностей в обслуживании. Но концепции в книге стоит изучать в любом случае.

2

Умные указатели обычно не выделяют память для объекта, на который они указывают, - вы сами создаете объект и строите интеллектуальный указатель нужного типа из полученного необработанного указателя.

Однако интеллектуальный указатель управляет жизненным циклом объекта после этого, поэтому ему необходимо знать, как освободить объект, если он больше не ссылается, в соответствии с правилами выбранного вами умного указателя.

Действие по умолчанию - использовать «удалить», но вместо этого вы можете указать свой собственный «пользовательский делетер».

Например:

MyClass* CreateMyObject(/* whatever args you need */) { 
    // Do whatever it takes to create your object in the pool 
    return myObject; 
} 

void DeleteMyObject(MyClass *obj) { 
    // Do whatever it takes to free object from pool 
} 

std::shared_ptr<MyClass> ptr(CreateMyObject(....), DeleteMyObject); 

Я не уверен, если это решит ваши первоначальные проблемы - вам все еще нужно обрабатывать сложности выделения и де-распределение ваших объектов в бассейнах - но вы получите жизнь преимущества управления циклом интеллектуальных указателей.

Here - это как минимум один учебник по использованию пользовательских удалений.

+0

Это действительно решает мои первоначальные проблемы. Я где-то читал, что лучше использовать make_shared, чтобы избежать двойных затрат на размещение. Есть ли способ получить это поведение с помощью пользовательских удалений? –

+0

Или, может быть, что-то вроде пула умных указателей было бы лучше. Мне просто нужно минимизировать вызовы выделения памяти. –