Długie łańcuchy


Łańcuchy AnsiString, nazywane łańcuchami długimi, reprezentują denamicznie alokowane łańcuchy o maksymalnej długości ograniczonej jedynie rozmiarem dostepnej pamięci. Składają się z 8-bitowych znaków ANSI.

Zmienna stanowiąca odwołanie do łańcucha długiego jest wskaźnikiem zajmującym 4 bajty pamięci. Kiedy zmienna jest pusta, czyli odwołuje się do łańcucha zerowej długości — wskaźnik ma wartość nil, a łańcuch nie zajmuje żadnych dodatkowych zasobów. Kiedy zmienna nie jest pusta, wskazuje na dynamicznie alokowany blok pamięci zawierający właściwy łańcuch znaków, 32-bitowy indykator długości i 32 licznik odwołań. Pamięć ta jest alokowana na stosie, ale jej zarządzanie jest wenętrznie zautomatyzowane i nie wymaga dodatkowego kodu programu.

Ponieważ zmienne odwołujące się do długich łańcuchów są wskaźnikami, dwa lub więcej z nich mogą odwoływać się do tego samego łańcucha. Kompilator wykorzystuje to do oszczędniejszego wykorzystania zasobów i szybszego wykonywania podstawień. Kiedykolwiek zmienna long-string jest niszczona lub przypisywana jest do niej nowa wartość, licznik odwołań starego łańcucha jest dekrementowany, a licznik odwołań nowego (jeśli jest) jest inkrementowany; jeśli licznik odwołań łańcucha wyniesie zero, jego blok pamięci jest automatycznie zwalniany. Ten proces nazywany jest mechanizmem zliczania odwołań (reference-counting). Kiedy używa się indeksowania do zmiany wartości pojedynczego znaku w łańcuchu, automatycznie wykonywana jest kopia łańcucha, ale tylko jeśli licznik odwołań wynosi więcej niż 1. Nazywa się to semantyką copy-on-write.