Usa lo strumento giusto per il lavoro.
Se il tuo programma può generare eccezioni, assicurati che il tuo codice sia a conoscenza delle eccezioni. L'uso di puntatori intelligenti, RAII ed evitare la costruzione in 2 fasi sono buoni punti di partenza.
Se hai riferimenti ciclici senza semantica chiara sulla proprietà, puoi prendere in considerazione l'uso di una libreria di raccolta rifiuti o il refactoring del tuo progetto.
Buone librerie ti permetteranno di codificare il concetto non sul tipo, quindi nella maggior parte dei casi non dovrebbe importare quale tipo di puntatore stai usando oltre ai problemi di gestione delle risorse.
Se lavori in un ambiente multi-thread, assicurati di capire se il tuo oggetto è potenzialmente condiviso tra thread. Uno dei motivi principali per considerare l'utilizzo di boost :: shared_ptr o std :: tr1 :: shared_ptr è perché utilizza un conteggio dei riferimenti thread-safe.
Se sei preoccupato per l'allocazione separata dei conteggi di riferimento, ci sono molti modi per aggirare questo. Utilizzando la libreria boost :: shared_ptr è possibile raggruppare i contatori di riferimento o utilizzare boost :: make_shared (la mia preferenza) che alloca l'oggetto e il conteggio dei riferimenti in una singola allocazione, alleviando così la maggior parte dei problemi di cache cache che le persone hanno. È possibile evitare l'hit di prestazioni dell'aggiornamento del conteggio dei riferimenti nel codice critico delle prestazioni tenendo un riferimento all'oggetto al livello più alto e passando i riferimenti diretti all'oggetto.
Se hai bisogno di una proprietà condivisa ma non vuoi pagare il costo del conteggio dei riferimenti o della raccolta dei rifiuti, considera l'utilizzo di oggetti immutabili o una copia su idioma in scrittura.
Tieni presente che di gran lunga le tue più grandi vittorie in termini di prestazioni saranno a livello di architettura, seguite da un livello di algoritmo e, sebbene queste preoccupazioni di basso livello siano molto importanti, dovrebbero essere affrontate solo dopo aver affrontato i problemi principali. Se hai a che fare con problemi di prestazioni a livello di errori nella cache, hai tutta una serie di problemi che devi anche conoscere come la falsa condivisione che non ha nulla a che fare con i puntatori per dire.
Se stai utilizzando i puntatori intelligenti solo per condividere risorse come trame o modelli, prendi in considerazione una libreria più specializzata come Boost.Flyweight.
Una volta adottato il nuovo standard, spostare la semantica, i riferimenti ai valori e l'inoltro perfetto renderanno il lavoro con oggetti e contenitori costosi molto più semplice ed efficiente. Fino ad allora non archiviare i puntatori con semantica di copia distruttiva, come auto_ptr o unique_ptr, in un contenitore (il concetto standard). Prendi in considerazione l'utilizzo della libreria Boost.Pointer Container o l'archiviazione dei puntatori intelligenti di proprietà condivisa in Container. Nel codice critico per le prestazioni puoi considerare di evitarli entrambi a favore di contenitori intrusivi come quelli di Boost.Intrusive.
La piattaforma target non dovrebbe davvero influenzare troppo la tua decisione. Dispositivi integrati, smartphone, telefoni stupidi, PC e console possono eseguire correttamente il codice. Requisiti di progetto come budget di memoria rigidi o nessuna allocazione dinamica mai / dopo il caricamento sono preoccupazioni più valide e dovrebbero influenzare le tue scelte.