std::string и выравнивание данных

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

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

ЦП хоста - x86_64.

1 ответ

Решение

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

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

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

Другие вопросы по тегам