тип std :: array с выровненными элементами в C ++ 11 - PullRequest
0 голосов
/ 11 января 2019

Я хотел бы знать, как лучше определить тип std :: array с помощью дополнительной функции выравнивания памяти с использованием современного C ++ 11. Я понимаю, что alignas нельзя использовать с псевдонимами типов, но это дух того, что я пытаюсь сделать:

template<class T, std::size_t N, std::size_t A>
using AlignedArray = alignas(A) std::array<T, N>;

который может быть создан следующим образом:

AlignedArray<int8_t, 4, 32> MyArray;

Лучшая рабочая версия, которую я мог придумать, это:

template<class T, std::size_t N, std::size_t A>
struct alignas(A) AlignedArray : std::array<T, N> {
    using std::array<T, N>::array;
};

Кто-нибудь может предложить что-нибудь попроще или лучше? Я новичок в вопросах выравнивания памяти, поэтому любые советы будут оценены.

Как было отмечено в предыдущем вопросе, вы можете сделать это, конечно:

alignas(32) std::array<int8_t, 4> MyArray;

Но это не определяет повторно используемый тип, так что это не то, что я ищу в этом вопросе.

1 Ответ

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

Какова ваша цель? Для любого данного T, std::array обеспечит правильное выравнивание. Если вам нужно жестко перекомпоновать ваши типы, вы должны изменить выравнивание самого T, иначе только первый элемент массива будет переопределен:

alignas(64) std::array<int8_t, 16> a; // array[0] is overaligned, array[1] is not

struct OveralignedNum
{
  alignas(64) int8_t value;
};

std::array<OveralignedNum, 16> b; // every element is overaligned
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...