2012-05-05 11 views
22

Przeczytałem raport o błędach GCC i ludzie mówili o "vstringu". Przeszukując WEB zauważyłem http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.2/vstring_8h.html.Co to jest "vstring" GCC?

Czy ktoś może się zastanawiać nad tym, do czego jest przydatny i do czego służy? Dlaczego warto używać go zamiast std :: string?

+1

Podany link znajduje się bezpośrednio u góry * "Ten plik jest rozszerzeniem GNU do standardowej biblioteki C++." * Oczywiście, to nie odpowiada na twoje pytanie w całości. –

+0

Jeśli obsługiwana jest pamięć, była to/była eksperymentalna reimplementacja 'std :: string' z tym samym interfejsem, ale inna odwaga. Plik ma daty praw autorskich w latach 2005-2007 i nic poza nim; zalecamy przeszukiwanie archiwum list dyskusyjnych ['libstdC++ '] (http://gcc.gnu.org/ml/libstdc++/) w tym okresie dla wzmianek. – zwol

Odpowiedz

23

GCC vstring to wszechstronna klasa łańcuchów, wprowadzona w implementacji GCC 4.1: libstdc++.

Jest kompatybilny z std::basic_string, z tych dodatkowych informacji:

  • dwie klasy bazowe są:
    • domyślny unika liczenia odniesienia i jest zoptymalizowana dla krótkich ciągów;
    • alternatywny, nadal używa go (liczenie odwołań), poprawiając w kilku obszarach o niskim poziomie (np. Wyrównanie). Zobacz vstring_fwd.h dla niektórych przydatnych typów.
  • Różne algorytmy zostały przepisane (np. Zamienione), usprawniono kod i dodano proste optymalizacje.
  • Opcja 3 DR 431 jest zastosowana dla obu dostępnych baz, poprawiając w ten sposób obsługę stanowych podzielników.

DR431 to Library Working Group Defect Report 431, z opcją 3 wyglądającą jak implementacja lepszej obsługi przydziału dla klasy, aby umożliwić lepszą wymianę i inne operacje związane z przydziałem.

Podstawowe informacje znajdują się pod GCC 4.1's release notes, w sekcji Runtime Library.

edit:

Wygląda jakby Pierwotnym celem tego rozszerzenia było stworzenie podstaw do realizacji C++ 11 std::string. Paolo Carlini, autor GCC/libstdC++, komentuje w tym numerze GCC Bug Report, że <ext/vstring.h> zawiera niereferencyjną policzoną eksperymentalną wersję następnego std::string. Komentarz z dnia 12 kwietnia 2012:

Co staraliśmy się wyjaśnić, że jest to rodzaj problemu jest dobrze znane i mniej lub bardziej wpływa dowolny odniesienia liczone realizacja ... To nie jest przypadku, gdy liczenie nie jest stosowana i rzeczywiście będzie to nie być wykorzystywane (na nowej C++ 11 standardu) w nowej realizacji std::string który obecnie prezentujący jak <ext/vstring.h> ...

+0

Jakie są powody, aby je wymyślić? Czy ostatecznie stanie się implementacją std :: string? –

+1

@ JohannesSchaub-litb - Wierzę, że był to pierwotny cel 'ext/vstring.h', który zapewniłby implementację niereferencyjnych łańcuchów znaków, która ostatecznie stałaby się domyślną (lub podstawą) nowego' std :: string' implementacja dla implementacji GCC w C++ 11. Istnieje wiele komentarzy na listach mailingowych GCC i raportach o błędach, które zdają się wskazywać na to, jak ten komentarz: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52938#c5 i to: http: // old.nabble.com/Re%3A--RFC--C%2B%2B1x-breaking-the-ABI-in-one-more-place-%3A%28-p28618810.html. To tyle, ile wiem, bez pytania. – birryree

+2

http://gcc.gnu.org/ml/libstdc++/2012-01/msg00064.html oznacza, że ​​jedynym powodem, dla którego nie stało się już implementacją 'std :: string' jest ograniczenie zgodności ABI. – zwol