Как создать 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 Перегрузки). Тем не менее, все реализации, которые я видел, на самом деле используют один и тот же прием.

Альтернативой является выделение целой страницы за раз, и вы можете самостоятельно управлять памятью с помощью специального распределителя. Вы можете сделать это, хотя это может занять много времени, чтобы сделать правильно.

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