2016-09-03 15 views
9

Jestem prawdopodobnie "na leśnej drodze", jak my, Niemcy. (Przysłówek o niewłaściwej drodze)Jaka jest różnica między standardowymi implementacjami biblioteki w C++?

C++ definiuje standardową bibliotekę i ten standard jest często aktualizowany w C++ 98, C++ 11, C + 17 (popraw mnie jeśli się mylę). Zakładam, że każdy kompilator lub system operacyjny definiuje własną implementację tej standardowej biblioteki.

Więc poza oczywistymi częściami specyficznymi dla systemu OS, jakie są różnice (jeśli występują) między tymi implementacjami standardowej biblioteki?

Czy istnieją "warianty" implementacji dla tego samego systemu operacyjnego? A jeśli tak, to kiedy chciałbym zawracać sobie głowę zastosowaniem tej implementacji?

+0

Myślę, że było małe rozszerzenie do 11 w 14, chociaż nie powinienem twierdzić, że wiem o nim dużo. – mathreadler

Odpowiedz

6

Zasadniczo każda definicja każdego kontenera jest specyficzna dla danej implementacji. Standard dyktuje jedynie deklarację i oczekiwane zachowanie, skutki uboczne i warunki.

przykład z §21.4.2:

basic_string(const basic_string& str, 
       size_type pos, size_type n = npos, 
       const Allocator& a = Allocator()); 

Wymaga: pos <= str.size()

Zgłasza: out_of_range jeśli pos > str.size().

e ff ECTS: Konstrukty obiektu klasy basic_string i określa e nn długość odblaskowe rlen pierwotnej wartości parametru jako mniejszą n i str.size() - pos, jak wskazano w tabeli 65.

Jak widać Standard mówi także, że to, co robi konstruktor z , to nie powinno być zaimplementowane. Definiuje również podpis, który powinien zostać użyty.Rzeczywista implementacja różni się w zależności od dostawcy kompilatora - gcc i clang mają różne implementacje, chociaż są one dla tej samej platformy, ale konstruktor robi to samo.

Nie trzeba się martwić o wdrożeń (dobrze, technicznie to zrobić - niektóre implementacje nie wdrażają wszystko, ale to rzadko), ponieważ wszystkie one (powinien) zrobić wszystko udokumentowane w standard.

+1

Szczegółowe informacje dotyczące implementacji są * bardzo * znaczące, jeśli bierze się pod uwagę wydajność. Nie tak bardzo, jeśli bierzesz pod uwagę tylko funkcję. –

4

Cóż, słowo standard sugeruje pewne znaczenie, nie jest.

Chodzi o to, że jeśli rzeczy to standard, to każda implementacja musi odzwierciedlać ten standard.

Innymi słowy: nie martw się o standardy, ale o te rzeczy, które nie są dokładnie określone, na przykład here.

Poza tym jest to bardzo szeroki temat. Myślę, że powinieneś wąska go do bardziej szczegółowych pytań/obszarów.

Edit - powody, dla których różne grupy tworzą własne implementacje:

  1. w przeciwieństwie do Javy, na przykład, nie ma „złote standardy” realizacja
  2. kompilatora budowniczych chcieć drobne dostrojenia do bibliotek ich produktu (i może to dotyczyć tylko kwestii prawnych/licencyjnych)
+2

Ale jest coś takiego jak "standardowa biblioteka Dinkumware C++", "biblioteka standardowa Apache C++" lub "biblioteka GNU C++". Tak więc wszyscy po prostu myśleli: "Hej, to jest niesamowite, pozwalamy wszystkim zaimplementować to samo". A może są to różne systemy operacyjne? – FirefoxMetzger

+3

@FirefoxMetzger, Na początek, jego części wymagają kodu specyficznego dla kompilatora. – chris

+1

@FirefoxMetzger Standard nie określa, w jaki sposób zaimplementować określony kontener lub funkcję, wymaga jedynie, aby * semantyka * tej klasy/metody była spójna we wszystkich systemach. W niektórych przypadkach jest to ściśle określone przez standard, aw innych nie jest, przykładem tego ostatniego byłoby ['std :: vector :: shrink_to_fit'] (http://en.cppreference.com/w/cpp/ container/vector/shrink_to_fit) gdzie to, czy dana metoda działa, czy nie, jest całkowicie zależne od implementacji - jest to * niezobowiązujące żądanie *. – ArchbishopOfBanterbury

Powiązane problemy