Вопросы обратной совместимости при переходе от const std :: string & к std :: string_view? - PullRequest
6 голосов
/ 04 февраля 2020

Я поддерживаю библиотеку C ++, которая часто использует const std::string& аргументы в своем API. Однако я получил несколько пользовательских запросов на переключение на std::string_view, чтобы помочь повысить эффективность, которая была бы невозможна с текущим API.

Я подумываю просто заменить все экземпляры аргументов const std::string& на std::string_view (возможно, с проверкой функции, которая проверяет, что std::string_view доступно). Это нарушит обратную совместимость для любого из моих пользователей? Я попробовал простую замену, и она, похоже, ничего не сломала в моем коде или тестах, но, конечно, это не исчерпывающая проверка.

Я понимаю, что это сломает некоторый код, который зависит от точные сигнатуры функций для моей библиотеки. Для простоты предположим, что я не позволяю пользователям зависеть от точных сигнатур / аргументов типов для моих функций.

1 Ответ

3 голосов
/ 04 февраля 2020

Я пытался заменить std::string const& на std::string_view несколько раз в своем собственном коде, и одно из следующих действий всегда приводило меня в замешательство:

  • std::string_view никогда не принадлежит, поэтому если любой из ваших std::string -кодов должен иметь символьные буферы по причинам жизни, эта часть кода не может быть преобразована для использования std::string_view. Эти проблемы могут быть тонкими, поэтому следует соблюдать осторожность.
  • Исходя из первого пункта, любой код, который требует владения / std::string, означает, что прирост эффективности, который вы могли бы получить при полном использовании std::string_view, может не быть полностью реализованным.
  • Если вы полагаетесь на строки с нулевым символом в конце, то std::string_view не является хорошим кандидатом. Обратите пристальное внимание на все функции, которые могут требовать char const* аргументов, когда делается неявное предположение, что буфер символов заканчивается на '\0'.

Если вы можете гарантировать, что все вышеперечисленные условия встретил, тогда вы, вероятно, хорошо до go с миграцией от std::string до std::string_view.

...