char* vs std:string vs char[]

0

Link do strony
Ciekaw jestem waszego zdania na ten temat. Która metoda obsługi tekstu w C++ jest najlepsza?
[edit] W jakich sytuacjach którą powinno się stosować?

6

Mało precyzyjna ta strona, char* dla literałów znakowych to nie "bad form", tylko po prostu niepoprawny kod: https://dev.krzaq.cc/stop-assigning-string-literals-to-char-star-already/

Osobiście, o ile nie piszesz kodu, który ma się kompilować w C i nie masz jakichś niesamowitych wymagań dot. wydajności1, to pisz z użyciem std::string i std::string_view. Jak masz takie wymagania to pewnie i tak wiesz co chcesz/musisz użyć.

1std::string nie jest wolniejszy ani szybszy. Ale - szczególnie bez std::string_view - czasem trochę ciężej nim operować jeśli np. chcesz bardzo dokładnie kontrolować jego czas życia Chodzi tu o bardzo niszowe problemy.

1

Wystarczy sobie wyobrazić / sprawdzić jaka jest męka z funkcją w duchu C zwracającą nowo powstały char *.
Obudowanie tego w dziesiątkach miejsc zwalnianiem (a czasem tzreba się wstrzymać ze zwalnianiem) ani nie jest bezpieczne, ani wydajne.
Jak ktoś szukał błedów pamięci w C, to dobrze wie dlaczego już używa std:string

1

Zdecydowanie std::string. Sam ogarnia pamięć(czy to przy "normalnym" użyciu czy przy wyjątkach) i ma SSO.

1

Wersje ala C są przestarzałe.

  1. wskaźnikowa nie ma rozmiaru
  2. tablicowa wymaga specjalnego szablonu

Ja bym proponował stosować zawsze:

std::string s1 = "Hello"s;

Które jest stringiem zawsze od chwili narodzin.
https://en.cppreference.com/w/cpp/string/basic_string/operator%22%22s

1

stała typu std::string ma tą wadę, że wymaga inicjalizacji przy starcie programu.
std::string_view nie ma tej wady (konstruktory są constexpr), a jest bardziej poręczny od const char[].

1

Z osobistych doświadczeń (bardziej z próby rzeczowej pomocy na SO) z napisami.
Można by oczekiwać, że std::ostringstream powinien być zoptymalizowany do budowania napisu (taki builder dla std::string).
Z moich testów wynika, że realloc bufora leci dość często zarzynając wydajność, podczas tworzenia dłuższych napisów.
Niestety API std::ostringstream nie przewiduje metody reserve, którą posiada std::string. IMO to powinno być dodane do standardu.

Dlatego jak się nie robi bardziej skomplikowanego formatowania, dużo lepiej jest budować napis w samym std::string zawczasu wywołując reserve z przewidywaną długością napisu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1