¿Debería cambiar de uso de boost::shared ptr a std:: shared ptr?


Me gustaría habilitar el soporte para C++0x en GCC con -std=c++0x. No necesito absolutamente necesariamente ninguna de las características actualmente compatibles con C++11 en GCC 4.5 (y pronto 4.6), pero me gustaría empezar a acostumbrarme a ellas. Por ejemplo, en algunos lugares donde uso iteradores, un tipo auto sería útil.

Pero de nuevo, no necesito ninguna de las características soportadas actualmente. El objetivo aquí es animarme a incorporar las características del nuevo estándar en mi programación de "vocabulario".

Por lo que sabes del soporte de C++11, ¿es una buena idea habilitarlo en GCC, y luego aceptarlo, por ejemplo, cambiando de usar boost::shared_ptr a std::shared_ptr exclusivamente ya que los dos no se mezclan?

PD: Soy consciente de esta buena pregunta que compara los diferentes sabores de shared_ptr pero estoy pidiendo un consejo de mayor nivel sobre el que utilizar antes de que el estándar se finalice. Otra forma de decirlo es, cuando un compilador como GCC dice que soporta un "característica experimental", ¿significa eso que es probable que encuentre errores extraños durante la compilación que serán importantes sumideros de tiempo y una fuente de preguntas crípticas sobre StackOverflow?

Editar : Decidí cambiar de std::shared_ptr porque simplemente no confío en su soporte en GCC 4.5 como se muestra por ejemplo en esta pregunta.

Author: Community, 2011-06-12

8 answers

Hay un par de razones para cambiar a std::shared_ptr:

  • Se elimina una dependencia de Boost.
  • Depuradores. Dependiendo de su compilador y depurador, el depurador puede ser "inteligente" acerca de std::shared_ptr y mostrar el objeto apuntado directamente, donde no diría, la implementación de boost. Al menos en Visual Studio, std::shared_ptr parece un puntero simple en el depurador, mientras que boost::shared_ptr expone un montón de entrañas de boost.
  • Otras nuevas características definidas en su pregunta vinculada.
  • Se obtiene una implementación que está casi garantizada para ser move-semantics habilitado, lo que podría ahorrar algunas modificaciones refcount. (Teóricamente not no he probado esto yo mismo) A partir del 2014-07-22 al menos, boost::shared_ptr entiende la semántica de movimiento.
  • std::shared_ptr utiliza correctamente delete [] en los tipos de matriz, mientras que boost::shared_ptr causa un comportamiento indefinido en tales casos (debe usar shared_array o un deleter personalizado) (En realidad, estoy corregido. Ver esto the el la especialización para esto es solo para unique_ptr, no para shared_ptr.)

Y una gran razón evidente para no hacerlo:

  • Se estaría limitando al compilador C++11 y a las implementaciones de bibliotecas estándar.

Finalmente, realmente no tienes que elegir. (Y si está apuntando a una serie de compiladores específica (por ejemplo, MSVC y GCC), podría extender esto fácilmente para usar std::tr1::shared_ptr cuando esté disponible. Desafortunadamente no parece haber una forma estándar de detectar TR1 apoyo)

#if __cplusplus > 199711L
#include <memory>
namespace MyProject
{
    using std::shared_ptr;
}
#else
#include <boost/shared_ptr.hpp>
namespace MyProject
{
    using boost::shared_ptr;
}
#endif
 56
Author: Billy ONeal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:55:02

Supongo que depende de cuánto uses boost. Personalmente solo lo uso muy escasamente (de hecho, la biblioteca de números aleatorios, en un solo proyecto). Recientemente he comenzado a usar -std=c++0x para mis otros proyectos, y uso las nuevas características de la biblioteca std:: como shared_ptr en ellos. Me gusta que mis proyectos tengan el mínimo de dependencias, así que prefiero depender de la implementación de la biblioteca estándar del compilador que de boost.

Pero no creo que haya una respuesta única para todo esto pregunta.

 13
Author: Neil Butterworth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-12 13:58:09

Siempre debe usar std::shared_ptr siempre que sea posible, si está disponible, en lugar de boost. Esto es básicamente porque todas las interfaces nuevas que usan shared_ptr usarán el ptr compartido estándar.

 12
Author: Puppy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-12 14:00:46

Probablemente no sea mala idea empezar a acostumbrarse a usar std::shared_ptr cuando el compilador lo permita. Dado que la interfaz es la misma que shared_ptr de boost, siempre puede volver a cambiar si lo necesita.

 7
Author: Chris Mennie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-12 13:48:44

Si solo está construyendo en una plataforma que está bien (hacer el cambio)
(Nota:Tiene pruebas unitarias para validar la compatibilidad con versiones anteriores, ¿no?)

Si compila en múltiples plataformas es donde se vuelve un poco más incómodo, ya que necesita validar que las características de g++ 4.5 están disponibles en todas las plataformas que usa (es decir, compilar para MAC/Linux el compilador predeterminado de Mac g++ sigue siendo un par de versiones detrás de los compiladores predeterminados en Linux).

 4
Author: Martin York,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-12 16:50:44

Otra razón para cambiar a std::shared_ptr: soporta std::unique_ptr, es decir, tiene constructor.

boost::shared_ptr no lo hace.

 4
Author: papafi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-03 14:20:20

Aparte de la coherencia de la implementación, boost::shared_ptr actualmente conserva al menos dos ventajas de nicho sobre std::shared_ptr:

 4
Author: dhaffey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-30 23:08:54

He encontrado que std::shared_ptr es más rápido que boost::shared_ptr. Hice una prueba, puede revisar el código y ver los resultados del gráfico circular comparando los punteros compartidos boost, Qt y std.

introduzca la descripción de la imagen aquí

Https://www.osletek.com...

 1
Author: rosewater,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-03 15:58:09