Здравствуйте, 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 >>