Подтвердить что ты не робот

Как реализовано std::string?

Мне любопытно узнать, как реализуется std::string и как он отличается от c string? Если стандарт не указывает какую-либо реализацию, то любая реализация с объяснением будет отличной в том, как она удовлетворяет строковым требованиям, заданным стандартом?

4b9b3361

Ответ 1

Практически каждый компилятор, который я использовал, предоставляет исходный код для среды выполнения, поэтому, независимо от того, используете ли вы GCC или MSVC или что-то еще, у вас есть возможность взглянуть на реализацию. Однако большая часть или все std::string будут реализованы в виде кода шаблона, что может сделать очень трудное чтение.

Книга Скотта Мейера, Эффективная версия STL, содержит главу о реализациях std::string, в которой содержится общий обзор общих вариаций:" Пункт 15: Помните об изменениях в реализациях string.

Он говорит о 4 вариациях:

  • несколько вариантов реализации, подсчитанной по ссылке (обычно называемой копией при записи) - когда строковый объект копируется без изменений, пересчет увеличивается, но фактические данные строки отсутствуют. Оба объекта указывают на одни и те же refcounted данные, пока один из объектов не изменяет его, вызывая "копирование при записи" данных. Варианты заключаются в том, что хранятся такие вещи, как refcount, locks и т.д.

  • реализация "короткой строки оптимизации" (SSO). В этом варианте объект содержит обычный указатель на данные, длину, размер динамически распределенного буфера и т.д. Но если строка достаточно короткая, она будет использовать эту область для хранения строки вместо динамического выделения буфера

Кроме того, Herb Sutter "More Exceptional С++" имеет приложение (Приложение A: "Оптимизации, которые не являются (в многопоточном мире)" ), в котором обсуждается, почему при повторной компоновке копии часто возникают проблемы с производительностью в многопоточных приложениях из-за проблем с синхронизацией. Эта статья также доступна онлайн (но я не уверен, что она точно такая же, как в книге):

Обе эти главы были бы полезны для чтения.

Ответ 2

std::string - это класс, который обтекает какой-то внутренний буфер и предоставляет методы для управления этим буфером.

Строка в C - это просто массив символов

Объяснение всех нюансов о том, как работает std::string, займет слишком много времени. Возможно, посмотрите на исходный код gcc http://gcc.gnu.org, чтобы узнать, как они это делают.

Ответ 3

Вот пример реализации в ответ на этой странице.

Кроме того, вы можете посмотреть gcc-реализацию, предполагая, что у вас установлена ​​gcc. Если нет, вы можете получить доступ к их исходному коду через SVN. Большинство std::string реализовано basic_string, поэтому начните там.

Другим возможным источником информации является Watcom компилятор

Ответ 4

Решение С++ для строк сильно отличается от c-версии. Первое и самое важное отличие заключается в том, что с использованием решения ASCIIZ std::string и std:: wstring используют два итератора (указатели) для хранения фактической строки. Базовое использование классов строк обеспечивает динамическое выделенное решение, поэтому в стоимости накладных расходов процессора при работе с динамической памятью обработка строк более удобна.

Как вы, наверное, уже знаете, C не содержит встроенного типичного строкового типа, предоставляет только пару строковых операций через стандартную библиотеку. Одно из основных различий между C и С++, которое С++ предоставляет завернутую функциональность, поэтому его можно рассматривать как поддельный общий тип.

В C вам нужно пройти через строку, если вы хотите узнать ее длину, функция члена std::string:: size() - это только одна команда (конец - начало). Вы можете смело добавлять строки друг к другу, пока у вас есть память, поэтому нет необходимости беспокоиться о ошибках переполнения буфера (и, следовательно, о эксплоидах), потому что добавление создает более крупный буфер, если это необходимо.

Как ранее рассказывал кто-то, строка выводится из векторной функциональности шаблонизированным способом, поэтому упрощается работа с многобайтовыми системами. Вы можете определить свой собственный тип строки, используя typedef std:: basic_string specific_str_t; выражение с любым произвольным типом данных в параметре шаблона.

Я думаю, что есть достаточно плюсов и сторон обеих сторон:

С++ string Плюсы:  - Более быстрая итерация в определенных случаях (с определенными размерами, и не требуется данных из памяти, чтобы проверить, находится ли вы в конце строки, сравнивая два указателя, которые могут повлиять на кеширование)  - Операция буфера заполнена функциональностью строки, поэтому меньше забот о проблемах с буфером.

Строка С++ Минусы: - из-за материала динамического распределения памяти основное использование может повлиять на производительность. (к счастью, вы можете указать строковому объекту, каков должен быть исходный размер буфера, поэтому, если вы не превысите его, он не будет выделять динамические блоки из памяти) - часто странные и непоследовательные имена по сравнению с другими языками. это плохая вещь о любом материале stl, но вы можете использовать ее, и это создает немного специфическое чувство С++. - интенсивное использование шаблонов заставляет стандартную библиотеку использовать решения на основе заголовков, поэтому это сильно влияет на время компиляции.

Ответ 5

Это зависит от стандартной библиотеки, которую вы используете.

STLPort, например, является реализацией стандартной библиотеки С++, которая реализует, среди прочего, строки.