Ostatnio przeprowadzałem kilka potrzebnych optymalizacji. Jedną rzeczą, którą robiłem, jest zmiana niektórych ostringstreams -> sprintfs. Sprint do zestawu std :: strings do tablicy w stylu ac, ala
char foo[500];
sprintf(foo, "%s+%s", str1.c_str(), str2.c_str());
Okazuje się, że implementacja std :: string :: c_str () Microsoftu działa w stałym czasie (zwraca tylko wewnętrzny wskaźnik). Wygląda na to, że libstdc ++ robi to samo . Zdaję sobie sprawę, że std nie daje żadnych gwarancji dla c_str, ale trudno wyobrazić sobie inny sposób na zrobienie tego. Jeśli, na przykład, skopiowali do pamięci, musieliby albo przydzielić pamięć dla bufora (pozostawienie go wywołującemu, aby go zniszczył - NIE jest to część umowy STL) LUB musieliby skopiować do wewnętrznej pamięci statycznej bufor (prawdopodobnie nie jest wątkowo bezpieczny i nie masz żadnych gwarancji na jego żywotność). Tak więc proste zwrócenie wskaźnika do wewnętrznie utrzymywanego łańcucha zakończonego zerą wydaje się być jedynym realistycznym rozwiązaniem.
c_str
jest to metoda const (lub przynajmniej ma przeciążenie const - nie pamiętam, które), nie zmienia to logicznej wartości, więc może być tego powodemmutable
. Przerwałoby to wskaźniki od innych wywołańc_str
, z wyjątkiem tego, że wszelkie takie wskaźniki muszą odnosić się do tego samego ciągu logicznego (więc nie ma nowego powodu do ponownego przydzielenia - musi być już terminator zerowy), w przeciwnym razie musiało już być wywołanie innego niż -stała metoda pomiędzy.