Use a ferramenta certa para o trabalho.
Se o seu programa pode lançar exceções, verifique se o seu código reconhece as exceções. Usar ponteiros inteligentes, RAII e evitar a construção de duas fases são bons pontos de partida.
Se você tiver referências cíclicas sem semântica clara de propriedade, considere usar uma biblioteca de coleta de lixo ou refatorar seu design.
Boas bibliotecas permitem que você codifique para o conceito e não o tipo, portanto, na maioria dos casos, não importa qual tipo de ponteiro você está usando além dos problemas de gerenciamento de recursos.
Se você estiver trabalhando em um ambiente multithread, entenda se seu objeto é potencialmente compartilhado entre threads. Um dos principais motivos para considerar o uso de boost :: shared_ptr ou std :: tr1 :: shared_ptr é porque ele usa uma contagem de referência segura para threads.
Se você estiver preocupado com a alocação separada das contagens de referência, existem várias maneiras de contornar isso. Usando a biblioteca boost :: shared_ptr, é possível agrupar a alocação dos contadores de referência ou usar o boost :: make_shared (minha preferência), que aloca o objeto e a contagem de referência em uma única alocação, aliviando a maioria das preocupações de falta de cache que as pessoas têm. Você pode evitar o impacto no desempenho da atualização da contagem de referência no código crítico de desempenho mantendo uma referência ao objeto no nível superior e transmitindo referências diretas ao objeto.
Se você precisar de propriedade compartilhada, mas não quiser pagar o custo da contagem de referência ou da coleta de lixo, considere usar objetos imutáveis ou uma cópia no idioma de gravação.
Lembre-se de que, de longe, suas maiores vitórias em desempenho serão no nível da arquitetura, seguidas por um nível de algoritmo, e embora essas preocupações de baixo nível sejam muito importantes, elas devem ser abordadas somente depois que você resolver os principais problemas. Se você está lidando com problemas de desempenho no nível de falhas de cache, há uma série de problemas dos quais você também deve estar ciente, como o compartilhamento falso, que não tem nada a ver com indicadores por palavra.
Se você estiver usando ponteiros inteligentes apenas para compartilhar recursos como texturas ou modelos, considere uma biblioteca mais especializada como o Boost.Flyweight.
Uma vez adotado o novo padrão, a semântica de movimentação, as referências de valor e o encaminhamento perfeito tornarão o trabalho com objetos e contêineres caros muito mais fácil e eficiente. Até lá, não armazene ponteiros com semântica de cópia destrutiva, como auto_ptr ou unique_ptr, em um Container (o conceito padrão). Considere usar a biblioteca Boost.Pointer Container ou armazenar ponteiros inteligentes de propriedade compartilhada em Containers. No código crítico de desempenho, você pode evitar esses dois a favor de contêineres intrusivos, como os do Boost.Intrusive.
A plataforma de destino não deve realmente influenciar muito sua decisão. Dispositivos embarcados, smartphones, telefones estúpidos, PCs e consoles podem executar o código perfeitamente. Os requisitos do projeto, como orçamentos rígidos de memória ou nenhuma alocação dinâmica de sempre / após o carregamento, são preocupações mais válidas e devem influenciar suas escolhas.