Use la herramienta adecuada para el trabajo.
Si su programa puede lanzar excepciones, asegúrese de que su código tenga en cuenta las excepciones. Usar punteros inteligentes, RAII y evitar la construcción en 2 fases son buenos puntos de partida.
Si tiene referencias cíclicas sin una semántica de propiedad clara, puede considerar usar una biblioteca de recolección de basura o refactorizar su diseño.
Las buenas bibliotecas le permitirán codificar el concepto, no el tipo, por lo que no debería importar en la mayoría de los casos qué tipo de puntero está utilizando más allá de los problemas de gestión de recursos.
Si está trabajando en un entorno de subprocesos múltiples, asegúrese de comprender si su objeto es potencialmente compartido entre subprocesos. Una de las razones principales para considerar el uso de boost :: shared_ptr o std :: tr1 :: shared_ptr es porque utiliza un recuento de referencia seguro para subprocesos.
Si le preocupa la asignación separada de los recuentos de referencia, hay muchas maneras de evitar esto. Usando la biblioteca boost :: shared_ptr, puede asignar en conjunto los contadores de referencia o usar boost :: make_shared (mi preferencia) que asigna el objeto y el recuento de referencia en una sola asignación, aliviando así la mayoría de las preocupaciones de pérdida de caché que tienen las personas. Puede evitar el impacto de rendimiento de actualizar el recuento de referencias en el código crítico de rendimiento manteniendo una referencia al objeto en el nivel más alto y pasando referencias directas al objeto.
Si necesita una propiedad compartida pero no quiere pagar el costo del recuento de referencias o la recolección de basura, considere usar objetos inmutables o una copia en el idioma de escritura.
Tenga en cuenta que, de lejos, sus mayores logros de rendimiento serán a nivel de arquitectura, seguidos de un nivel de algoritmo, y si bien estas preocupaciones de bajo nivel son muy importantes, deben abordarse solo después de que haya abordado los principales problemas. Si está lidiando con problemas de rendimiento en el nivel de errores de caché, entonces tiene una gran cantidad de problemas que también debe tener en cuenta, como el intercambio falso que no tiene nada que ver con los punteros por decir.
Si está utilizando punteros inteligentes solo para compartir recursos como texturas o modelos, considere una biblioteca más especializada como Boost.Flyweight.
Una vez que se adopte el nuevo estándar, la semántica de movimiento, las referencias de valor y el reenvío perfecto harán que trabajar con objetos y contenedores caros sea mucho más fácil y más eficiente. Hasta entonces, no almacene punteros con semántica de copia destructiva, como auto_ptr o unique_ptr, en un Contenedor (el concepto estándar). Considere usar la biblioteca Boost.Pointer Container o almacenar punteros inteligentes de propiedad compartida en Contenedores. En el código crítico de rendimiento, puede considerar evitar ambos a favor de contenedores intrusivos como los de Boost.Intrusive.
La plataforma objetivo realmente no debería influir demasiado en su decisión. Los dispositivos integrados, teléfonos inteligentes, teléfonos tontos, PC y consolas pueden ejecutar el código perfectamente. Los requisitos del proyecto, como presupuestos estrictos de memoria o ninguna asignación dinámica alguna vez / después de la carga, son preocupaciones más válidas y deberían influir en sus elecciones.