Как создать std::vector из char/std::byte, где первый байт выровнен до 16 байтов, но нет заполнения?
Существует существующий вопрос, который требует C++03 и не имеет ответа, поэтому я открою новый.
Проблема в том, что я хочу иметь std::vector
из std::byte
, но чтобы .data()
(первый элемент массива данных) выровнен по 16 байтам.
alignas
на обернутый символ не помогает, потому что я не хочу иметь пробелы выравнивания в массиве. Другими словами, я хочу настроить выравнивание 1 для элементов, но я хочу выравнивание 16 для массива.
В идеале я хотел бы избежать использования собственного распределителя. Если есть какой-либо TBB или вектор повышения, который делает то, что я хочу, это было бы также замечательно.
1 ответ
Выравнивание данных в векторе не предусмотрено по умолчанию. Даже для выровненных классов.
Лучший способ сделать выравнивание - это метод align_allocator boost.
К сожалению, он не мешает заполнению, он даже перераспределяет указатель на выравнивание. Начиная с C++17, он может использовать выравнивание нового (см. std::aligned_val_t
Перегрузки). Тем не менее, все реализации, которые я видел, на самом деле используют один и тот же прием.
Альтернативой является выделение целой страницы за раз, и вы можете самостоятельно управлять памятью с помощью специального распределителя. Вы можете сделать это, хотя это может занять много времени, чтобы сделать правильно.