Стандарт STL не требует пересчета из std :: string. Но на самом деле большая часть C ++
реализации предоставляют пересчитанные строки копирования при записи, что позволяет вам передавать
строка по значению в качестве примитивного типа. Также эти реализации (по крайней мере, g ++) используют
атомарные операции, делающие эту строку свободной от блокировки и поточной безопасности.
Простой тест показывает семантику копирования при записи:
#include <iostream>
#include <string>
using namespace std;
void foo(string s)
{
cout<<(void*)s.c_str()<<endl;
string ss=s;
cout<<(void*)ss.c_str()<<endl;
char p=ss[0];
cout<<(void*)ss.c_str()<<endl;
}
int main()
{
string s="coocko";
cout<<(void*)s.c_str()<<endl;
foo(s);
cout<<(void*)s.c_str()<<endl;
}
Только два адреса печатаются точно после использования непостоянного элемента.
Я протестировал этот код с использованием компилятора HP, GCC и Intel и получил похожие результаты - строки
работают как контейнеры для копирования при записи.
С другой стороны, VC ++ 2005 ясно показывает, что каждая строка полностью скопирована.
Почему?
Я знаю, что в VC ++ 6.0 была ошибка, в которой реализована не поточно-ориентированная реализация
подсчет ссылок, вызвавший случайные программные сбои. Это причина? Они просто
боишься больше использовать подсчет ссылок, даже если это обычная практика? Они предпочитают не
использовать пересчет вообще для решения проблемы?
Спасибо