Вопрос

Так что я думал о распределении Pimpl и Stack.Я пишу библиотеку и решил использовать Pimpl, чтобы скрыть частный член класса.Это означает, что у меня будет такой класс, как это

class Foo {
private:
    class Handle;
    std::tr1::shared_ptr<Handle> handle;
public:
    Foo();
};
.

Это довольно прямо вперед.Но потом в конструкторе вы делаете это

Foo::Foo() : handle(new Handle()) {}
.

Поэтому, когда кто-то использует мою библиотеку, создает Foo в стеке, они в любом случае, в любом случае выполняют распределение кучи.Это компромисс вы должны жить с использованием Pimpl?Я подумал о выпуске документации с предупреждением рядом с конструкторами: «Предупреждение: это приводит к распределению кучи» или Somesuch.

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

Любые мысли или предложения?Я чрезмерно рассмотря на программистов, используя мою библиотеку?

Это было полезно?

Решение

Это коммерчески вы должны жить с использованием Pimpl?

Эффективно, да, хотя есть методы, такие как те, которые обсуждаются Trb Satter в " Быстрый Pimpl IDIOM, «, который можно использовать для устранения или ускорения распределения кучи, на стоимость большей сложности.

Я думал о выпуске документации с предупреждением рядом с конструкторами: «Предупреждение: это приводит к распределению кучи» или Somesuch.

Только если нужно сделать это (то есть, только если ваши пользователи будут удивлены тем, что ваш класс выполнил распределение кучи). Многие классы выполняют распределение кучи, включая многие из них в стандартной библиотеке C ++ (например, все контейнеры).

Я чрезмерно - учитывая программистов, используя мою библиотеку?

Возможно :-). Если у вас нет высоких требований к производительности для вашего класса или вы ожидаете, что случаи вашего класса будут созданы и уничтожены чрезвычайно часто, я бы не беспокоился об этом. Конечно, если у вас есть значительные требования к производительности, Pimpl может не быть хорошим выбором.

Другие советы

Поэтому, когда кто-то использует мою библиотеку, создает Foo в стеке, они в любом случае, в любом случае выполняют распределение кучи. Это компромисс вы должны жить с использованием Pimpl?

yep.

Я думал о выпуске документации с предупреждением рядом с конструкторами: «Предупреждение: это приводит к распределению кучи» или Somesuch.

Я бы считал, что над агрессивным комментированием :) Если ваш класс настолько эффективнее, возможно, вы должны избежать Pimpl IDIOM. Если вы представляете номер, это может быть относительно и стоит отметить. Если вы скрываете внедрение соединения базы данных, не стоит комментариев :)

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

Да, это немного более очевидно для пользователя, но, вероятно, не стоит относиться к себе.

Любые мысли или предложения? Я чрезмерно рассмотря на программистов, используя мою библиотеку?

Есть компромисс, но если ваш класс достаточно сложный, чтобы действительно получить от Pimpl IDIOM, вы, вероятно, можете предположить, что выделение кучи в порядке. Если бы я использовал свою библиотеку, это, вероятно, не касается меня.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top