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
,