Std::string против char *
выполняет std::string хранить данные по-разному, чем char * в любом стеке или куче, или просто выведен из 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
, другие люди уже ответили.