在 C++11 中具有对齐元素的 std::array 类型
Posted
技术标签:
【中文标题】在 C++11 中具有对齐元素的 std::array 类型【英文标题】:std::array type with aligned elements in C++11 【发布时间】:2019-01-11 20:26:22 【问题描述】:我想知道使用现代 C++11 定义具有内存对齐附加功能的 std::array 类型的最佳方法。我知道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>
【问题讨论】:
虽然std::array
已经保证它的元素的对齐方式是正确的,但我会认为它是正确的。
可能重复:***.com/questions/39058850/… 虽然我不确定这是否是您要问的。
@FrançoisAndrieux,也许吧?但我可能需要一个更大的对齐大小,然后才能保证,请参阅示例。
@RSahu 这显示了在声明对齐变量时如何覆盖类型的对齐。 atb 要求对齐类型。
您要对齐数组还是数组的元素?不是一回事……
【参考方案1】:
你的目标是什么?对于任何给定的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
【讨论】:
@atb 等等,什么?过度对齐通常是关于向 SIMD 提供数据,而 SIMD 关心的是 first 元素是否过度对齐,而其余元素则被打包。您是否因为非 SIMD 原因而过度对齐? @Yakk-AdamNevraumont,是的,我很困惑。我想我最初的问题是有效的,但没有用。以上是关于在 C++11 中具有对齐元素的 std::array 类型的主要内容,如果未能解决你的问题,请参考以下文章
(Bootstrap 4+) - 具有多个元素的列:在同一行上对齐元素