Re[10]: Подсчет ссылок в реализации std
От: Шахтер Интернет  
Дата: 23.07.04 01:26
Оценка:
Здравствуйте, folk, Вы писали:

F>Здравствуйте, Flamer, Вы писали:


F>[]


F>>Чего-то я (наверное по недомыслию) не нахожу неоднозначностей в твоем примере... Как вариант моей трактовки:


F>>
F>>1  std::string a;
F>>2  std::string b;
F>>3  a = "aaaa"; // reference count to "aaaa" = 1 (self)
F>>4  b = a;      // reference count to "aaaa" = 2 (a and b). Reference count to "aaaa" in b instance = 1;
F>>5  a = "bbbb"; // a now owned another string ("bbbb"). 
F>>               // Decrement reference count to "aaaa" (if 0 - delete "aaaa"), 
F>>               // then allocate new buffer for string, copy string to buffer and set 
F>>               // reference count to 1 (exclusive ownership).
F>>               // In this sample, b had continue ownership to string "aaaa" with reference count = 1.
F>>


F>С copy on write не все так хорошо как кажется. Например:

F>
F>string a = "aaaa";
F>string b = a;
F>cout << a[1] << '\n'; // (*)
F>

F>Оператор [] для неконстантной строки должен вернуть std::allocator<char>::reference, т.е. char&. Поскольку нельзя допускать, чтобы shared buffer был изменен через эту ссылку, то в строчке (*) должна быть создана копия исходной строки.

Да, но без COW копии будут создаваться всегда. Т.е. экономия всё равно есть, пусть и не 100%. А вообще -- не пользуйтесь stl!
Мне кажется, что немутирующие строки с подсчетом ссылок для приложений полезнее.
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.