Это становится общей моделью в моем коде, поскольку, когда мне нужно управлять объектом, который должен быть неготовным, потому что либо он «тяжелый», либо B. это ресурс операционной системы, такой как критический раздел:Есть ли способ повысить эффективность shared_ptr, сохранив счетчик ссылок внутри контролируемого объекта?
class Resource;
class Implementation : public boost::noncopyable
{
friend class Resource;
HANDLE someData;
Implementation(HANDLE input) : someData(input) {};
void SomeMethodThatActsOnHandle() {
//Do stuff
};
public:
~Implementation() { FreeHandle(someData) };
};
class Resource
{
boost::shared_ptr<Implementation> impl;
public:
Resource(int argA) explicit {
HANDLE handle =
SomeLegacyCApiThatMakesSomething(argA);
if (handle == INVALID_HANDLE_VALUE)
throw SomeTypeOfException();
impl.reset(new Implementation(handle));
};
void SomeMethodThatActsOnTheResource() {
impl->SomeMethodThatActsOnTheHandle();
};
};
Таким образом, shared_ptr заботится о подсчете ссылок головных болях, позволяя Resource
быть копируемыми, даже если основная ручка должна быть закрыта только один раз все ссылки на него будут уничтожены.
Однако, похоже, что мы могли бы сэкономить накладные расходы на выделение ссылочных счетчиков shared_ptr и такое отдельно, если бы мы могли каким-то образом перемещать эти данные внутри Implementation
, как это делают интрузивные контейнеры boost.
Если это делает преждевременную оптимизацию, взломать некоторых людей, я действительно согласен с тем, что мне это не нужно для моего текущего проекта. Но мне любопытно, если это возможно.
У Boost есть 'intrusive_ptr': http://www.boost.org/doc/libs/1_42_0/libs/smart_ptr/intrusive_ptr.html Но я не отправляю в качестве ответа, потому что я не уверен, что это что ты хочешь. – GManNickG
Кроме того, ЭТО ПРОДОЛЖИТЕЛЬНАЯ ОПТИМИЗАЦИЯ ТЕМПЕРАТУРЫ WTF ВЫ ДЕЛАЕТЕ? Разве ты не знаешь о ЦИТАТЕ КУНТА? ОПТИМИЗАЦИЯ ПРАКТИКИ - КОРН ВСЕГО ЗЛА? Хм, ты не слышал, что это? ТЕПЕРЬ У ВАС ЕСТЬ. – GManNickG
@GMan: LOL! Хотя читатели этого читают, я считаю, что цитата: «Мы должны забыть о небольшой эффективности, скажем, около 97% времени: преждевременная оптимизация - это корень всего зла». Я утверждаю, что это 3% -ый случай. –