C ++ 11中具有对齐元素的std :: array类型

时间:2019-01-11 20:26:23

标签: c++ c++11

我想知道定义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 :(得分:3)

您的目标是什么?对于任何给定的Tstd::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