Quindi ho pensato a PIMPL e allo stack allocation. Ho scritto una libreria e ho deciso di usare PIMPL per nascondere il membro privato della classe. Ciò significa che avrei una classe dichiarata in questo modoAllocazione PIMPL e stack
class Foo {
private:
class Handle;
std::tr1::shared_ptr<Handle> handle;
public:
Foo();
};
È piuttosto semplice. Ma poi nel costruttore si esegue questa operazione
Foo::Foo() : handle(new Handle()) {}
Così, quando qualcuno che utilizza la mia libreria crea un Foo in pila, sono essenzialmente facendo un mucchio di allocazione comunque. È questo il compromesso con cui devi convivere quando usi PIMPL? Ho pensato di rilasciare la documentazione con un avvertimento accanto ai costruttori: "ATTENZIONE: questo si traduce in un'allocazione dell'heap" o qualcosa di simile.
Il mio altro pensiero era di avere tutte le classi che sono esposte all'implementazione come pure interfacce virtuali e un sacco di metodi statici di fabbrica che restituiscono puntatori intelligenti. Questo significa anche allocazione dell'heap ma non c'è alcun trucco.
Qualche idea o suggerimento? Sono eccessivamente premuroso nei confronti dei programmatori che usano la mia biblioteca?
Il problema con un tale avviso è che un numero enorme di operazioni risulta in allocazioni di heap. Creare un 'std :: vector' lo fa anche. O ridimensionando uno. Il compromesso è quanto sia importante nascondere gli interni della classe, rispetto alle prestazioni extra di evitare allocazioni di heap. – jalf