2016-04-30 10 views
7

Szukasz konkretnej C++ środowiska (kompilatory, systemów operacyjnych, sprzętu, itd.), Dla których nie ma biblioteki standardowej (np „x wersja gcc dla Nintendo 3DS”)Jakie aktywnie używane środowiska C++ nie obsługują (większości, jeśli nie wszystkich) standardowej biblioteki?

Niektóre C++ biblioteki takie jak Box2D lub TinyXML2 że celem aby być przenośnym, używaj bardzo niewiele ze standardowej biblioteki, jeśli w ogóle. Nie w pełni rozumiem to podejście. Jakie aktywnie używane środowiska C++ nie obsługują (większości, jeśli nie wszystkich) standardowej biblioteki?

+1

Osoby projektujące środowiska osadzone czasami unikają STL. Istotne: http://stackoverflow.com/questions/2226252/embedded-c-to-use-stl-or-not – computerfreaker

+0

@computerfreaker Prawda, ale martwię się bibliotekami, które mają na celu * wspieranie * systemów wbudowanych, ale nie ze szkodą dla wsparcia platform komputerowych lub podobnych. – JesseTG

+0

Branża gier obawia się pogorszenia wydajności spowodowanej alokacją sterty. Często unikają użycia standardowej biblioteki. I mówimy tutaj o małych kosztach, takich jak przydział w współdzielonej wskazówce dla liczenia ref .. – Alex

Odpowiedz

-3

Prosta Odpowiedź to, gdy nie chcesz dołączać pakietów STL.

Z większością IDE, jeśli twój projekt nie ma pozycji #include <package_name>, które dzwoni do STL, to STL nie jest dołączany podczas kompilacji.

Chociaż mogą być przypadki, gdzie trzeba specjalnie wykluczyć STL przez IDE/kompilatora

Jednym z głównych powodów, aby uniknąć STL jest zmniejszenie ostatecznej skompilowany rozmiar pliku.

+1

Pytam o określone środowiska C++ (kompilatory, systemy operacyjne, sprzęt itp.), Dla których nie ma standardowej biblioteki (np. "Wersja x gcc dla Nintendo 3DS"). – JesseTG

5

Obsługa standardowej biblioteki C++ może być różna dla różnych dostawców kompilatorów, a nawet dla różnych wersji tego samego kompilatora. Jest to szczególnie ważne w systemach wbudowanych i na różnych konsolach.

Przez "różnią się" rozumiem, że mogą występować błędy, funkcje zaimplementowane inaczej lub nawet brakujące funkcje. Android ma na przykład bardzo dobrą implementację biblioteki standardowej C++ minimal.

Istnieje wiele dziwnych i wspaniałych kompilatorów C++; to nie tylko GCC i Visual Studio. Nintendo na przykład używa kompilatora Green Hills.

Tak więc z powodu różnych kompilatorów, najlepszym sposobem na obsługę dużej liczby z nich jest trzymanie się tylko funkcji zapewnianych przez standardową bibliotekę C. Wiele przenośnych bibliotek nawet unika używania bardziej nowoczesnych funkcji C++.

1

Jedyne środowiska, w których mogę myśleć, to te wolnostojące (systemy operacyjne i programy wbudowane z jednym procesem). Oczywiście niektórzy programiści aktywnie unikają używania STL, ale jest to raczej decyzja projektowa niż brak wsparcia w środowisku. Uważam, że największą przeszkodą w tych ograniczonych środowiskach jest obsługa wyjątków (które rzucają wiele funkcji STL). Aby uzyskać wsparcie dla tych, należy przesłać ABI ABI i rozwinąć bibliotekę (aby odwijać stos i przechodzić do instrukcji catch). Nic nie stoi na przeszkodzie, aby wprowadzić te wymagane bity, ale jest to więcej zależności, które w oczywisty sposób powodują wzdęcia tylko dla podstawowego wsparcia dla czegoś takiego jak listy połączone. Aby przesłać ABI, patrz: the OSDEV wiki entry.

Istnieją inne zależności dla nowszych standardów C++ (C++ 11 i nowsze). Mogę sobie wyobrazić, że std::thread wymaga implementacji wątków, takich jak pthreads. std::chrono prawdopodobnie będzie potrzebował jakiejś pośredniej warstwy implementowanej między nim a czasem standardowej biblioteki C. Prawdopodobnie istnieje więcej funkcji STL, które wymagają obsługi systemu operacyjnego. Niezwykle ważna jest część STL, która jest częścią składową STL. Szablony często znacznie zwiększają ostateczny rozmiar binarny. Na przykład w przypadku std::list, std::list<MyClass1> i std::list<MyClass2> spowoduje specjalizację dwóch różnych pojemników. Kod będzie wyglądać bardzo podobnie, ale zostanie zduplikowany, aby obsługiwać ich typ elementu.Inne implementacje połączonych list często używają pustego wskaźnika do łączenia węzłów, a następnie w razie potrzeby przesyłają je do odpowiedniej klasy. W ten sposób istnieje jedna instancja klasy list dla ints, char *, MyClass1 itd. Zwiększony rozmiar binarny jest często niedopuszczalny w środowiskach osadzonych, , ale należy zauważyć, że staje się on również problemem, gdy LibA implementuje LibA :: LinkedList i LibB LibB :: LinkedList.

Jakość wdrożeń stała się obecnie mniejszym problemem. Pomocne może być również to, że GCC kieruje się do wielu architektur, dzięki czemu dostępne są nowe standardy kompilacji (jak wyżej, nadal trzeba portować niektóre funkcje STL). Najstarszym GCC, którego użyłem, było GCC v4.3 lub coś podobnego do wbudowanego urządzenia PowerPC. Zostało wydane w 2010 roku i miało pełne wsparcie STL.

Podsumowując, zapotrzebowanie na biblioteki z bardzo zogniskowanym zestawem funkcjonalnym może nadal być pomocne, ale moim zdaniem zmniejszają one liczbę platform, na które są projektowane, jeśli zapewniają funkcjonalności, które obejmują zachowanie zależne od systemu operacyjnego. W przypadku nieprzetworzonej struktury danych i obsługi algorytmów nie można popełnić błędu. Koniec końców, musisz trafić na pewien podzbiór platform. W C++ 11 wierzę, że celujesz w 99% używanych systemów operacyjnych na komputery/serwery i 99% wbudowanych urządzeń linuksowych. Jak podkreślono w innej odpowiedzi, Android był problemem, ale wydaje się, że uwydatnia się this page, aby uzyskać wszystkie bity wymagane do uzyskania naprawdę nowoczesnego środowiska.

Powiązane problemy