выполняет std::string хранить данные по-разному, чем char * в любом стеке или куче, или просто выведен из char * в класс?
Std::string против char *
Ответ 1
char*
- Является ли размер одного указателя для вашей архитектуры процессора.
- Может быть значением, возвращаемым из
malloc
илиcalloc
илиnew
илиnew[]
.- Если это так, перед тем, как это сделать, необходимо передать
free
илиdelete
илиdelete[]
. - Если это так, символы сохраняются в куче.
- Если это так, перед тем, как это сделать, необходимо передать
- Может быть результатом "декомпозиции" массива
char[ N ]
(константный N) или строкового литерала.- В общем случае, невозможно определить, указывает ли аргумент
char*
стек, кучу или глобальное пространство.
- В общем случае, невозможно определить, указывает ли аргумент
- Не тип класса. Он участвует в выражениях, но не имеет функций-членов.
- Тем не менее реализует интерфейс RandomAccessIterator для использования с
<algorithm>
и т.д.
std::string
- Размер нескольких указателей, часто три.
- Создает себя при создании: нет необходимости в
new
илиdelete
.- Соблюдает копию строки, если строка может быть изменена.
- Можно скопировать эту строку из
char*
. - По умолчанию внутренне использует
new[]
так же, как и дляchar*
.
- Обеспечивает неявное преобразование, которое делает прозрачным конструкцию из
char*
или литерала. - Тип класса. Определяет другие операторы для выражений, таких как catenation.
- Определяет
c_str()
, который возвращаетchar*
для временного использования.
- Определяет
- Реализует
std::string::iterator
тип сbegin()
иend()
.-
string::iterator
является гибким: реализация может сделать его супер-безопасным помощником для отладки или просто суперэффективнымchar*
на флип переключателя.
-
Ответ 2
Если вы имеете в виду, хранит ли он смежно, тогда ответ заключается в том, что он не требуется, но все известные (для меня, во всяком случае) реализации делают это. Скорее всего, это будет поддерживать теги c_str()
и data()
, которые должны возвращать непрерывную строку (завершение с нулевой точкой в случае c_str()
)
Насколько хранится память, она обычно находится в куче. Но в некоторых реализациях используется "Оптимизация коротких строк", в результате чего содержимое коротких строк сохраняется в небольшом внутреннем буфере. Таким образом, в случае, если строковый объект находится в стеке, возможно, что сохраненное содержимое также находится в стеке. Но это не должно иметь никакого значения, как вы его используете, поскольку один объект уничтожен, память, хранящая строковые данные, недействительна в любом случае.
(btw, здесь статья об аналогичной технике, применяемой в целом, что объясняет оптимизацию.)
Ответ 3
Они решают разные проблемы. char*
(или char const*
) указывает на строку стиля C, которая не обязательно принадлежит той, которая хранит указатель char*
. В C из-за отсутствия типа строки обязательно используйте char*
как "тип строки".
std::string
владеет строковыми данными, на которые указывает. Поэтому, если вам нужно сохранить строку где-то в своем классе, есть вероятность, что вы хотите использовать std::string
или ваш класс строк библиотеки вместо char*
.
При смежности хранения std::string
, другие люди уже ответили.