Re[9]: Подсчет ссылок в реализации std:
От: folk Россия  
Дата: 23.07.04 00:37
Оценка: +1
Здравствуйте, Flamer, Вы писали:

[]

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>


С copy on write не все так хорошо как кажется. Например:
string a = "aaaa";
string b = a;
cout << a[1] << '\n'; // (*)

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

F>Сорри фор инглиш — пиво было хорошее, и, как следствие закона сохранения энергии — инглиш получился фиговым
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.