выполняет 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, другие люди уже ответили.