Итак, я подумал о PIMPL и распределении стека. Я писал библиотеку и решил использовать PIMPL, чтобы скрыть закрытый член класса. Это означает, что у меня был бы класс, объявленный так
class Foo {
private:
class Handle;
std::tr1::shared_ptr<Handle> handle;
public:
Foo();
};
Это довольно прямолинейно. Но затем в конструкторе вы делаете это
Foo::Foo() : handle(new Handle()) {}
Поэтому, когда кто-то, использующий мою библиотеку, создает Foo в стеке, он в любом случае выполняет выделение кучи. Это компромисс, с которым вам приходится мириться при использовании PIMPL? Я думал выпустить документацию с предупреждением рядом с конструкторами: «ВНИМАНИЕ: это приводит к выделению кучи» или что-то в этом роде.
Моя другая мысль заключалась в том, чтобы все классы, которые подвергаются реализации, были чистыми виртуальными интерфейсами и целой кучей статических фабричных методов, возвращающих интеллектуальные указатели. Это также означает выделение кучи, но в этом нет хитрости.
Любые мысли или предложения? Я слишком внимательно отношусь к программистам, использующим мою библиотеку?
std::vector
тоже делает это. Или изменить размер одного. Компромисс заключается в том, насколько важно скрыть внутренности класса по сравнению с дополнительной производительностью, связанной с избеганием распределения кучи. - person jalf   schedule 11.07.2010