Re[2]: std::string as std::vector?
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 29.03.05 04:50
Оценка:
Здравствуйте, 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 символов...
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.