Así que he estado pensando en PIMPL y la asignación de la pila. He estado escribiendo una biblioteca y decidí usar PIMPL para ocultar al miembro privado de la clase. Eso significa que tendría una clase declarada asíPIMPL y la asignación de la pila
class Foo {
private:
class Handle;
std::tr1::shared_ptr<Handle> handle;
public:
Foo();
};
Es bastante sencillo. Pero entonces en el constructor de hacer esto
Foo::Foo() : handle(new Handle()) {}
Así que cuando alguien usando mi biblioteca crea un Foo en la pila, que están haciendo esencialmente una asignación del montón de todos modos. ¿Es este el compromiso con el que tienes que vivir cuando usas PIMPL? Pensé en lanzar la documentación con una advertencia al lado de los constructores: "ADVERTENCIA: Esto da como resultado una asignación de montón" o algo así.
Mi otro pensamiento fue tener todas las clases que están expuestas a la implementación como interfaces virtuales puras y un montón de métodos de fábrica estáticos que devuelven punteros inteligentes. Esto también significa asignación de montón, pero no hay ningún truco para eso.
¿Algún comentario o sugerencia? ¿Soy demasiado considerado con los programadores que usan mi biblioteca?
El problema con tal advertencia es que una gran cantidad de operaciones resultan en asignaciones de montón. Crear un 'std :: vector' también lo hace. O cambiar el tamaño de uno. La compensación es cuán importante es esconder las partes internas de la clase, en comparación con el rendimiento adicional de evitar las asignaciones de pila. – jalf