Czy powinienem przełączyć się z boost::shared PST na STD::shared PST?

Chciałbym włączyć obsługę C++0x w GCC za pomocą -std=c++0x. Nie koniecznie potrzebuję żadnej z aktualnie obsługiwanych funkcji C++11 w GCC 4.5 (a wkrótce 4.6), ale chciałbym zacząć się do nich przyzwyczajać. Na przykład w kilku miejscach, gdzie używam iteratorów, przydałby się Typ auto.

Ale znowu, nie potrzebuję żadnej z aktualnie obsługiwanych funkcji. Celem jest zachęcenie mnie do włączenia funkcji nowego standardu do mojego programowanie "słownictwa".

Z tego, co wiesz o obsłudze C++11, czy dobrym pomysłem jest włączenie go w GCC, a następnie objęcie go, na przykład, przełączeniem z boost::shared_ptr na std::shared_ptr wyłącznie, ponieważ oba nie mieszają się?

PS: wiem o to dobre pytanie , które porównuje różne smaki shared_ptr, ale proszę o radę wyższego poziomu, którą należy użyć przed sfinalizowaniem standardu. Innym sposobem ujęcia tego jest, gdy kompilator taki jak GCC mówi, że obsługuje "experimental feature", czy to oznacza, że prawdopodobnie napotkam dziwne błędy podczas kompilacji, które będą głównym pochłaniaczem czasu i źródłem tajemniczych pytań na StackOverflow?

Edit : postanowiłem przełączyć się z std::shared_ptr, ponieważ po prostu nie ufam jego wsparciu w GCC 4.5, jak pokazano na przykładzie w tym pytaniu .

Author: Community, 2011-06-12

8 answers

Istnieje kilka powodów, aby przełączyć się na std::shared_ptr:

  • usuwasz zależność od Boost.
  • debuggery. W zależności od kompilatora i debuggera, debugger może być "inteligentny" o std::shared_ptr i pokazywać wskazywany obiekt bezpośrednio, gdzie nie byłoby np. implementacji Boosta. Przynajmniej w Visual Studio std::shared_ptr wygląda jak zwykły wskaźnik w debuggerze, podczas gdy boost::shared_ptr eksponuje kilka wnętrzności Boosta.
  • inne nowe funkcje zdefiniowane w Twoim połączone pytanie.
  • dostajesz implementację, która jest prawie zagwarantowana, że będzie włączona semantyka move, co może zaoszczędzić kilka modyfikacji refcount. (Teoretycznie -- sam tego nie testowałem) przynajmniej od 2014-07-22, boost::shared_ptr rozumie semantykę ruchu.
  • std::shared_ptr poprawnie używa {[7] } na typach tablic, podczas gdy boost::shared_ptr powoduje nieokreślone zachowanie w takich przypadkach (musisz użyć shared_array lub niestandardowego deletera) (właściwie to się poprawiłem. Zobacz to -- the specjalizacja do tego jest tylko dla unique_ptr, a nie shared_ptr.)

I jeden główny rażący powód, aby nie:

  • ograniczyłbyś się do kompilatora C++11 i implementacji bibliotek standardowych.
W końcu nie musisz wybierać. MSVC i GCC), można go łatwo rozszerzyć o użycie std::tr1::shared_ptr, gdy jest dostępny. Niestety nie ma standardowego sposobu wykrywania TR1 wsparcie)
#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/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:02

Przypuszczam, że to zależy, ile używasz boost. Ja osobiĹ " cie korzystam z niej tylko bardzo oszczędnie (faktycznie biblioteka liczb losowych, w jednym projekcie). Ostatnio zacząłem używać -std=c++0x dla innych moich projektów i używam nowych funkcji biblioteki std::, takich jak shared_ptr w nich. Lubię, aby moje projekty miały minimum zależności, więc wolę być zależny od standardowej implementacji biblioteki kompilatora niż od boost.

Ale nie wydaje mi się, żeby była na to uniwersalna odpowiedź pytanie.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-12 13:58:09

Powinieneś zawsze używać std::shared_ptr tam, gdzie to możliwe, jeśli jest dostępny, zamiast boost. Dzieje się tak głównie dlatego, że wszystkie nowe interfejsy, które używają shared_ptr, będą używać standardowego współdzielonego ptr.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-12 14:00:46

To prawdopodobnie nie jest zły pomysł, aby zacząć przyzwyczajać się do używania STD::shared_ptr, gdy jest to dozwolone przez kompilator. Ponieważ interfejs jest taki sam jak shared_ptr Boosta, zawsze możesz przełączyć się z powrotem, jeśli zajdzie taka potrzeba.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-12 13:48:44

Jeśli budujesz tylko na jednej platformie, która jest w porządku (zrób Przełącznik)
(Uwaga: masz testy jednostkowe, które sprawdzają zgodność wsteczną, prawda?)

Jeśli kompilujesz na wielu platformach, staje się to trochę bardziej kłopotliwe, ponieważ musisz potwierdzić, że funkcje w g++ 4.5 są dostępne na wszystkich platformach, których używasz (tj. budowanie dla MAC / Linux domyślny kompilator Mac g++ jest nadal kilka wersji za domyślnymi kompilatorami na Linuksie).

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-12 16:50:44

Kolejny powód, aby przełączyć się na std::shared_ptr: obsługuje std::unique_ptr, tzn. posiada konstruktor.

boost::shared_ptr nie.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-03 14:20:20

Oprócz spójności implementacji, boost::shared_ptr obecnie zachowuje co najmniej dwie niszowe przewagi nad std::shared_ptr:

  • dostępność boost::make_shared_noinit. Jest to szczególnie przydatne w połączeniu z tablicami, unikając zarówno kosztów inicjalizacji zerowej, jak i kosztów związanych z oddzielną alokacją. (FWIW, jest to również proponowane dodanie do standardu.)
  • Boost.Python wykorzystuje specjalne Wsparcie boost::shared_ptr dla usuniętych typów niestandardowych deleterów, ale jeszcze nie to samo dla 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/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-30 23:08:54

Okazało się, że STD::shared_ptr jest szybsze niż boost::shared_ptr. Zrobiłem test, możesz przejrzeć kod i zobaczyć wyniki wykresu kołowego porównując boost, Qt i STD udostępnione wskaźniki.

Tutaj wpisz opis obrazka

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/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-03 15:58:09