Здравствуйте, Demay, Вы писали:
D>Здравствуйте, Mr. None, Вы писали:
D>Для подтверждения выше приведенного примера нельзя ли дать ссылку на стандарт ?
Сорри ошибся... в первом случае всё будет нормально, до тех пор пока не вызовете неконстантную функцию член...
MN>>Да пожалуйста: реализации stl идущие с MS VC 6.0 — 7.1 включительно... Они оптимизируют хранение строк малых размеров и внутри себя содержат 2 буфера — один выделенный статически размером в 15 символов, другой выделяется динамически, если строка вылезает за пределы 15 символов...
D>В stl идущие с MS VC 6.0 — 7.1 имеется буфер статический, а если его недостаточно, то динамический, то в конкретный момент времени используется только один, а не оба сразу, D>вы не поняли вопроса: Покажите мне реализацию stl которая использует для хранения несколько несмежных буферов, а затем сливает это все в один, а затем следуя вашей точке зрения освобождает его, надо полагать делать это она должна в деструкторе string.
Ну хотите я сам напишу? Я такой не видел, но это не означает, что такой не может быть. Такое поведение не противоречит стандарту, а следовательно возможно. Например, похожим образом может себя вести строка оптимизирующая операции конкатенации... Или строка поддерживающая многопоточный доступ — в этом случае возвращаемый из c_str буфер вообще может быть для каждого потока свой... топорно и не оптимально? — возможно... но вполне законно!
Вместо того, чтобы гадать вы скажите что вам действительно нужно. Ответ на вопрос "Гарантируется ли стандартом размещение элементов строки в непрерывном блоке памяти" дан — нет не гарантировано. А значение возвращаемое из c_str() вообще может быть копией и не ссылаться на внутреннее представление строки, так что, например, модифицировать его нельзя ни в коем случае.
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.