Tworząc string, wywołujesz alokowanie pamięci na dane. Z zasady ta pamięć jest większa niż niezbędna na obsługę "liter w stringu". Dodawanie do niego kolejnych liter, nie powoduje alokacji nowej porcji danych. Dzieje się tak do momentu osiągnięcia wielkości docelowej (maksymalnej wielkości pamięci). Po dodaniu następnego znaku, następuje realokacja. Ilość pamięci jest zwiększana, następuje kopiowanie danych do nowej przestrzeni i przestawienie przestrzeni na nowy wskaźnik (w std::string na dane wskazuje *.data().
Tu opisałem (nie w pełni) jedną z możliwych polityk czyli sposobu obsługi tej alokacji. Popatrz jak wyglądają u Ciebie wyniki takiego prostego programu. Obserwuj jak wyglądają wyniki capacity(), size() oraz wartość adresu gdzie rezydują dane. Jeśli będziesz mógł, uruchom program na innym kompilatorze, OS.
#include <iostream> #include <string> #include <cstddef> #include <iomanip> void show_info(const std::string& str) { std::cout << std::dec << "capacity = " << str.capacity() << " size = " << str.size() << " data = " << std::hex << static_cast<const void *>(str.data()) << '\n'; } int main() { std::string str; for(auto i = 0U; i < 128; i += 4) { str += ' '; show_info(str); } }
93,424 zapytań
142,421 odpowiedzi
322,646 komentarzy
62,785 pasjonatów
Motyw:
Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡
Oto polecana książka warta uwagi.Pełną listę książek znajdziesz tutaj