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