gtkmm gestisci / aggiungi vs puntatori intelligenti:

3

gtkmm fornisce una gestione a vita dei widget usando

Gtk::Widget* aWidget = Gtk::manage(new Widget()); 

Gtk::Widget.add(*aWidget);

Ciò delega la gestione a vita di unWidget al suo widget contenitore.

Abbiamo anche diversi tipi di puntatori intelligenti, in particolare i modelli di puntatori intelligenti C ++ 11, che uso ovunque.

Trovo che la sintassi di gestione / aggiunta sia più facile e più pulita da usare, ma non fa parte dello standard C ++, è una caratteristica specifica di gtkmm, che mi fa pensare che dovrei attenermi a std :: shared_ptr, ecc.

Quindi mi chiedo quali sono i vantaggi / svantaggi dei puntatori intelligenti rispetto al modello gtkmm di gestione / aggiunta (a parte i casi in cui è necessario il riferimento dopo che il contenitore del proprietario è stato eliminato o quando si ha un widget di livello superiore che non ha widget contenenti).

    
posta Vector 27.07.2013 - 06:51
fonte

1 risposta

3

Gtk::manage() risolve il problema specifico della gestione a vita per le gerarchie di widget. E lo risolve bene.

I puntatori intelligenti ( std::shared_ptr in particolare) hanno un intervallo di applicazione più ampio e pertanto saranno meno efficienti se utilizzati per risolvere questo problema specifico. La gestione a vita per le gerarchie di widget può essere risolta con shared_ptr , ma sarà:

  • non conciso quanto usando manage() (come hai indicato tu stesso);
  • meno efficiente in termini di utilizzo della memoria, dal momento che l'utilizzo di shared_ptr s introdurrà un sovraccarico della memoria: shared_ptr ha un'impronta di memoria del suo riferimento al suo conteggio di riferimento, che utilizzerà la dimensione - al contrario di manage() , che usa variabili come Gtk::Object.referenced_ che fanno parte della tua classe base Widget già in ogni momento. Pertanto, se hai un numero significativo di Widgets , quella differenza di dimensione potrebbe diventare un problema da prendere in considerazione;
  • non come mainstream come manage() in gtkmm (che ha alcune conseguenze, inclusa chiarezza e manutenibilità).

Come idea di favorire std::shared_ptr su Gtk::manage() perché shared_ptr fa parte di C ++ Standard, mentre manage() no - Non sono sicuro che cambierà la partita per un'applicazione media, come non usando manage() non tagli comunque la tua dipendenza da Gtk. Quindi la tua applicazione non acquisirà una portabilità migliore se andassi per shared_ptr .

Preferisco sfruttare l'API gtkmm nativa, per motivi di chiarezza ed efficienza.

P.S .: In realtà c'è un puntatore intelligente Glib::RefPtr , che gestisce la gestione a vita per determinati oggetti gtkmm. Anche in questo caso, poiché è una funzione nativa di Glib, sfrutta strutture built-in di Glib::ObjectBase , ed è quindi più efficiente di std::shared_ptr per alcune applicazioni, per i motivi spiegati nel secondo punto sopra.

    
risposta data 01.03.2014 - 15:05
fonte

Leggi altre domande sui tag