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