Существует существующий вопрос, требующий C++03 и не имеющий ответа, поэтому я открою новый.
У меня проблема в том, что я хочу иметь std::vector из std::byte, но так, чтобы .data() (первый элемент массива данных) был выровнен по 16 байтам.
alignas на обернутом символе не помогает, потому что я не хочу иметь пробелы выравнивания в массиве.
Другими словами, я хочу, чтобы для элементов было выравнивание по ключу 1, но для массива я хочу выравнивание по 16.
В идеале я хотел бы избежать использования пользовательского распределителя. Если есть какой-либо TBB или вектор повышения, который делает то, что я хочу, это тоже было бы здорово.
На платформах, где максимальное собственное выравнивание равно 16 или больше, вам не нужно делать ничего особенного, если вы используете распределитель по умолчанию.
@user463035818 user463035818 Хорошо, но я имею в виду, что может быть решение C++ 11, которое никто не опубликовал в качестве ответа на этот вопрос.
Ответ: stackoverflow.com/questions/12942548/…
ах, хорошо, вы имели в виду «требуется С++ 03» в смысле «другой вопрос требует С++ 03, но не более позднего стандарта», извините, неправильно понял





Выравнивание данных в векторе по умолчанию не предусмотрено. Даже для выровненных классов.
Лучший способ выполнить выравнивание — использовать выровненный_аллокатор повышения.
К сожалению, это не предотвращает заполнение, а даже перераспределяет ресурсы для адаптации указателя к выравниванию. Начиная с C++17, он может использовать выровненный новый (см. перегрузки std::aligned_val_t). Однако все реализации, которые я видел, на самом деле используют один и тот же трюк.
Альтернативой является выделение сразу всей страницы и выполнение собственного управления памятью с помощью специального распределителя. Вы можете сделать это, хотя это может занять много времени, чтобы сделать это правильно.
nitpick: вы должны предоставить ссылку на выровненный новый, так как его довольно сложно найти в Google, я полагаю, вы имеете в виду перегрузки, использующие std::align_val_t ?
Да, действительно, добавлю
Как насчет объединения
std::vectorиalignas(16) std::byteв класс?