Здравствуйте, 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>Сорри фор инглиш — пиво было хорошее, и, как следствие закона сохранения энергии — инглиш получился фиговым
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн