Останнім часом я робив деякі необхідні оптимізації. Одне, що я робив, - це змінити деякі ostringstreams -> sprintfs. Я sprintf'ing купу std :: рядків до масиву стилів ac, ала
char foo[500];
sprintf(foo, "%s+%s", str1.c_str(), str2.c_str());
Виявляється, реалізація std :: string :: c_str () Microsoft працює в постійний час (вона просто повертає внутрішній покажчик). Здається, що libstdc ++ робить те саме . Я розумію, що std не дає гарантій для c_str, але важко уявити інший спосіб цього зробити. Якщо, наприклад, вони скопійовані в пам'ять, вони повинні були б виділити пам'ять для буфера (залишаючи її абоненту, щоб знищити її - НЕ частина договору STL), або їм доведеться скопіювати у внутрішню статику буфер (мабуть, не безпечний для потоків, і ви не маєте гарантій на час його експлуатації). Тому просто повернення вказівника на внутрішньо підтримуваний нульовий завершений рядок представляється єдиним реалістичним рішенням.
c_str
, що метод const (або, принаймні, має перевантаження const - я забуваю який), це не змінює логічного значення, тому може бути причиноюmutable
. Це може перервати покажчики від інших викликів наc_str
, за винятком того, що будь-які такі вказівники повинні посилатися на один і той же логічний рядок (тому немає нової причини для перерозподілу - вже має бути нульовий термінатор), інакше вже повинно бути вже дзвінок на не -const метод між ними.