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,667 zapytań
142,588 odpowiedzi
323,127 komentarzy
63,191 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
Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.