Oprócz wymienionych tutaj powodów istnieje jeszcze jedna - binarna kompatybilność . Autorzy bibliotek nie mają kontroli nad tym, jakiej std::string
implementacji używasz i czy ma taki sam układ pamięci jak ich.
std::string
jest szablonem, więc jego implementacja pochodzi z lokalnych nagłówków STL. Teraz wyobraź sobie, że używasz lokalnej wersji STL o zoptymalizowanej wydajności, w pełni zgodnej ze standardem. Na przykład, możesz zdecydować się na włożenie bufora statycznego std::string
do każdego z nich, aby zmniejszyć liczbę alokacji dynamicznych i braków w pamięci podręcznej. W rezultacie układ pamięci i / lub rozmiar implementacji jest inny niż w bibliotece.
Jeśli tylko układ jest inny, niektóre std::string
wywołania funkcji składowych instancji przekazywane z biblioteki do klienta lub na odwrót mogą się nie powieść, w zależności od tego, które elementy zostały przeniesione.
Jeśli rozmiar jest również inny, wszystkie typy bibliotek posiadające std::string
element członkowski będą miały różny rozmiar po sprawdzeniu w bibliotece i kodzie klienta. Członkowie danych następujący po std::string
elemencie będą również przesunięciami przesunięcia, a każdy bezpośredni dostęp / dostęp wbudowany od klienta zwróci śmieci, pomimo „wyglądania OK” podczas debugowania samej biblioteki.
Konkluzja - jeśli biblioteka i kod klienta zostaną skompilowane w różnych std::string
wersjach, będą łączyły się dobrze, ale może to spowodować pewne nieprzyjemne, trudne do zrozumienia błędy. Jeśli zmienisz std::string
implementację, wszystkie biblioteki ujawniające członków z STL muszą zostać ponownie skompilowane, aby pasowały do std::string
układu klienta . A ponieważ programiści chcą, aby ich biblioteki były niezawodne, rzadko można je zobaczyć w std::string
dowolnym miejscu.
Szczerze mówiąc, dotyczy to wszystkich typów STL. IIRC nie mają znormalizowanego układu pamięci.