2015-05-15 3 views
1

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

Если это не указано в стандарте C++, в чем ситуация в libstdC++?

Главный процессор - x86_64.

+6

Почему 'std :: string' вместо' std :: vector'? –

+0

Я не забочусь о контейнере, пока буфер памяти выровнен, является ли буфер std :: vector гарантированным выравниванием? – user416983

+0

BTW, данные, упакованные в контейнер, имеют разный размер, мне нужно самому интерпретировать буфер. – user416983

ответ

4

Прежде всего, std::string, вероятно, не лучший контейнер для использования, если вы хотите сохранить произвольные данные. Вместо этого я предлагаю использовать std::vector.

Во-вторых, выравнивание всех распределений, выполняемых контейнером, контролируется его распределителем (вторым параметром шаблона, который по умолчанию равен std::allocator<T>). Распределитель по умолчанию будет выровнять распределения по размеру самого большого стандартного типа, который часто равен long long или long double, соответственно 8 и 16 байтов на моей машине, но размер этих типов не соответствует стандарту.

Если вам требуется конкретное выравнивание, вы должны либо проверить соответствие вашего компилятора, либо запросить выравнивание явно, предоставив свой собственный распределитель или используя std::aligned_storage.

Смежные вопросы