Std::string как массив байтов С++
Буфер протокола Google использует стандартный класс строк С++ std::string
как массив байтов переменной величины (см. здесь), аналогичный Python, где строка class также используется как массив байтов (по крайней мере, до Python 3.0).
Этот подход кажется хорошим:
- Это позволяет быстро назначать через
assign
и быстрый прямой доступ через data
, который не разрешен с помощью vector<byte>
- Это позволяет упростить управление памятью и ссылки на константу, в отличие от использования
byte*
.
Но мне любопытно: это предпочтительный способ для байтовых массивов в С++? Каковы недостатки этого подхода (более нескольких static_cast
s)
Ответы
Ответ 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
как массив байтов, он предполагает, что элементы смежны, где они не должны соответствовать стандартам.