Подтвердить что ты не робот

Std::string как массив байтов С++

Буфер протокола Google использует стандартный класс строк С++ std::string как массив байтов переменной величины (см. здесь), аналогичный Python, где строка class также используется как массив байтов (по крайней мере, до Python 3.0).

Этот подход кажется хорошим:

  • Это позволяет быстро назначать через assign и быстрый прямой доступ через data, который не разрешен с помощью vector<byte>
  • Это позволяет упростить управление памятью и ссылки на константу, в отличие от использования byte*.

Но мне любопытно: это предпочтительный способ для байтовых массивов в С++? Каковы недостатки этого подхода (более нескольких static_cast s)

4b9b3361

Ответ 1

std::string может иметь ссылочную подсчитанную реализацию, которая может быть или не быть преимуществом/недостатком того, что вы пишете - всегда будьте осторожны. std::string не может быть потокобезопасным. Потенциальным преимуществом std::string является простая конкатенация, однако это также может быть легко достигнуто с использованием STL.

Кроме того, все проблемы, связанные с протоколами, исчезают при использовании boost::asio и его объектов буфера.

Что касается недостатков std::vector:

  • Быстрое назначение может быть выполнено трюком с помощью std::swap
  • можно получить доступ через & arr [0] - векторы гарантированы (?), чтобы быть непрерывными (по крайней мере, все реализации реализуют их так)

Лично я использую std::vector для массивов с переменным размером и boost::array для статических размеров.

Ответ 2

Лично я предпочитаю std::vector, так как std::string не может быть сохранен смежно, а std::string::data() не обязательно должен быть O (1). std::vector будет иметь data функцию-член в С++ 0x.

Ответ 3

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