Как создать std :: vector из char / std :: byte, где первый байт выровнен до 16 байтов, но нет заполнения? - PullRequest
0 голосов
/ 25 января 2019

Существует вопрос , для которого требуется C ++ 03 и нет ответа, поэтому я открою новый.

Проблема в том, что я хочу, чтобы std::vector было std::byte, но чтобы .data() (первый элемент массива данных) был выровнен на 16 байтов.

alignas на обернутом символе не помогает, потому что я не хочу иметь пробелы выравнивания в массиве. Другими словами, я хочу настроить выравнивание 1 для элементов, но я хочу выравнивание 16 для массива.

В идеале я бы хотел избежать использования специального распределителя. Если есть какой-либо TBB или вектор повышения, который делает то, что я хочу, это было бы также замечательно.

1 Ответ

0 голосов
/ 25 января 2019

Выравнивание данных в векторе не предусмотрено по умолчанию. Даже для выровненных классов.

Наилучшим способом выравнивания является align_allocator boost.

К сожалению, это не мешает заполнению, оно даже перераспределяется, чтобы адаптировать указатель к выравниванию. Начиная с C ++ 17, он может использовать выровненный новый (см. std::aligned_val_t перегрузки). Тем не менее, все реализации, которые я видел, на самом деле используют один и тот же прием.

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

...