Здравствуйте, Mr. None, Вы писали:
[...]
MN>Кто мешает держать этот кэш внутри себя, обновлять при вызове c_str() и удалять при разрушении... Заметьте, никто не гарантирует даже следующего:
MN>MN>const char *str = someStlStr.c_str();
MN>SomeFunc(str); // не факт, что здесь была передана верная строка...
MN>
Для подтверждения выше приведенного примера нельзя ли дать ссылку на стандарт ?
А также правильно ли понял фразу: "не факт, что здесь была передана верная строка..."
Из этой фразы я понял, что можной найти такие условия, при которых result будет отличен от нуля, прошу указать мне такие условия:
char plain_str[] = "12345";
std::string someStlStr(plain_str);
const char *str = someStlStr.c_str();
SomeFunc(str); // не факт, что здесь была передана верная строка...
int result = strcmp(str, plain_str);
MN>И уж тем более никто не гарантирует, что будет работать это:
MN>MN>const char *str = someStlStr.c_str();
MN>someStlStr += "qwert";
MN>SomeFunc(str); // вот я не берусь сказать, что вы передали...
MN>
D>>Уважаемый ALL подскажите реализации STL использующие для строк различные несмежные блоки памяти, хотелось бы посмотреть устройство и логику работы string.
MN>Да пожалуйста: реализации stl идущие с MS VC 6.0 — 7.1 включительно... Они оптимизируют хранение строк малых размеров и внутри себя содержат 2 буфера — один выделенный статически размером в 15 символов, другой выделяется динамически, если строка вылезает за пределы 15 символов...
В stl идущие с MS VC 6.0 — 7.1 имеется буфер статический, а если его недостаточно, то динамический, то в конкретный момент времени используется только один, а не оба сразу,
вы не поняли вопроса: Покажите мне реализацию stl которая использует для хранения
несколько несмежных буферов, а затем сливает это все в один, а затем следуя вашей точке зрения освобождает его, надо полагать делать это она должна в деструкторе string.