Ответ 1
Длина префикса, так что длина вычислений O(1)
.
Null завершен, чтобы сделать маршалинг неуправляемым, пылающим быстро (неуправляемый, вероятно, ожидает строки с нулевым завершением).
После прочтения В чем обоснование строк с нулевым завершением? и некоторых подобных вопросов я обнаружил, что в С#/. Строковые строки являются внутренними, как префиксом длины, так и null завершен как Тип данных BSTR.
В чем причина того, что строки, как префикс длины, так и нуль завершены, а не, например,. только длина с префиксом?
Длина префикса, так что длина вычислений O(1)
.
Null завершен, чтобы сделать маршалинг неуправляемым, пылающим быстро (неуправляемый, вероятно, ожидает строки с нулевым завершением).
Вот выдержка из Jon Skeet Blog Сообщение о строках:
Несмотря на то, что строки не имеют нулевого конца в отношении API, массив символов заканчивается на нуль, так как это означает, что он может быть передан непосредственно неуправляемым функциям без участия копирования, предполагая, что inter-op указывает что строка должна быть упорядочена как Unicode.
Скорее всего, чтобы обеспечить удобство взаимодействия с COM.
В то время как поле длины упрощает для фреймворка определение длины строки (и она содержит строку с символами с нулевым значением), там очень много вещей, которые необходимо использовать инфраструктуре (или пользовательским программам) с которым ожидаются строки с нулевым завершением.
Как, например, API Win32.
Таким образом, удобно хранить NULL-терминатор в конце строковых данных, потому что, вероятно, он будет часто встречаться в любом случае.
Обратите внимание, что класс С++ std::string
реализуется одинаково (в любом случае в MSVC). По той же причине, я уверен (c_str()
часто используется для передачи std::string
тому, что хочет строку в стиле C).
Наилучшим предположением является то, что поиск длины является постоянным (O (1)) по сравнению с пересечением его, работающим в O (n).