我想知道定义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;
但这并没有定义可重用的类型,因此这不是我在此问题中所要查找的。 p>
答案 0 :(得分:3)
您的目标是什么?对于任何给定的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