Довольно быстро (и поэтому, вероятно, неполный) выстрелил в ответе на некоторые вопросы:
- Почему закодированы в качестве шаблона?
Шаблоны предоставляют возможность функциям класса работать с произвольными типами данных. Например, класс шаблонов basic_string<>
может работать на char
единицах (это то, что делает typedef std::string
) или wchar_t
единиц (std::wstring
) или любого типа POD. Использование чего-то другого, кроме char
, или wchar_t
необычно (std::vector<>
скорее всего будет использоваться), но возможность существует.
- Как это распределяет память?
Это не указывается стандартом. Фактически, шаблон basic_string<>
позволяет использовать произвольный распределитель для фактического распределения памяти (но не определяет, в каких точках могут потребоваться выделения). Некоторые реализации могут хранить короткие строки в действительных членах класса и распределять динамически только тогда, когда строки растут за пределами определенного размера. Запрошенный размер может быть именно тем, что нужно для хранения строки или может быть кратным размеру, чтобы обеспечить рост без перераспределения.
Дополнительная информация украдена из another SO answer:
Scott Meyer's book, Effective STL, есть глава по реализации станд :: струнные, что порядочный обзор общих изменений: «Пункт 15: быть в курсе изменений в реализациях строки».
Он говорит о 4 варианте:
нескольких вариаций на реф подсчета реализации (обычно известной как копирование при записи) - когда объект строки копируется без изменений, RefCount увеличивается на единицу, но реальная строку данных нет. Оба объекта указывают на одни и те же refcounted данные, пока один из объектов не изменяет его, вызывая «копирование при записи» данных. Существуют вариации, в которых хранятся вещи, такие как refcount, locks и т. Д.
реализация «короткой строки оптимизации». В этом варианте объект содержит обычный указатель на данные, длину, размер динамически распределенного буфера и т. Д. Но если строка достаточно короткая, она будет использовать эту область для хранения строки вместо динамического выделения буфера
- Почему (не) лучше, чем простые массивы символов с нулевым завершением?
Один из способов string
класса лучше, чем просто нулем массива является то, что класс управляет памятью требуется, поэтому дефекты, связанные с ошибками выделения или обгонных концом выделенных массивов снижается. Другая (возможно, незначительная) выгода заключается в том, что вы можете хранить «нулевые» символы в строке. Недостатком является то, что, возможно, некоторые накладные расходы - особенно, что вы в значительной степени должны полагаться на динамическое распределение памяти для класса строк. В большинстве сценариев, которые, вероятно, не являются серьезной проблемой, на некоторых настройках (например, в встроенных системах) это может быть проблемой.
У вас есть книга на C++? Если вы не знаете, как работают шаблоны, спрашивая, почему класс использует их, кажется, что я был в темноте для меня. – GManNickG
http://www.cplusplus.com/reference/string/ - хорошее начало. – Tristan
Не так ли сложно объяснить? Конечно, вы должны знать, чтобы объяснить это ясно ... Держу пари, кто-то здесь может сделать это, не покровительствовав. Интересно, действительно, что произойдет, если мои ученики придут ко мне с таким вопросом, и я просто сказал: «Пойди, узнай сам!» Вы, ребята, ... :) –