пул памяти интеллектуального указателя

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

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

0

Решение

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

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

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

Например:

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

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

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

2

Другие решения

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

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

1

По вопросам рекламы [email protected]