Цель любого и всех видов предложений «ссылка на строку» и «ссылка на массив» состоит в том, чтобы избежать копирования данных, которые уже принадлежат где-то еще и для которых требуется только неизменяемое представление. Рассматриваемое string_view
является одним из таких предложений; были и те, что раньше назывались, string_ref
и array_ref
тоже.
Идея состоит в том, чтобы всегда хранить пару указателей на первый элемент и размер некоторого существующего массива данных или строки.
Такой класс дескриптора представления может передаваться дешево по значению и предлагать дешевые операции подстроки (которые могут быть реализованы в виде простых приращений указателя и корректировки размера).
Многие виды использования строк не требуют фактического владения строками, и рассматриваемая строка часто уже будет принадлежать кому-то другому. Таким образом, существует реальный потенциал для повышения эффективности за счет исключения ненужных копий (подумайте обо всех выделениях и исключениях, которые вы можете сохранить).
Исходные строки C страдали от проблемы, заключавшейся в том, что нулевой терминатор был частью строковых API, и поэтому вы не могли легко создавать подстроки без изменения базовой строки (а-ля strtok
). В C ++ это легко решить, сохранив длину отдельно и поместив указатель и размер в один класс.
Одно серьезное препятствие и расхождение с философией стандартной библиотеки C ++, о которой я могу подумать, заключается в том, что такие классы «ссылочного представления» имеют полностью отличную семантику владения от остальной части стандартной библиотеки. По сути, все остальное в стандартной библиотеке безусловно безопасно и правильно (если оно компилируется, это правильно). С такими ссылочными классами это уже не так. Правильность вашей программы зависит от окружающего кода, который использует эти классы. Так что это сложнее проверить и научить.