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