在 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】:

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

【讨论】:

@atb 等等,什么?过度对齐通常是关于向 SIMD 提供数据,而 SIMD 关心的是 first 元素是否过度对齐,而其余元素则被打包。您是否因为非 SIMD 原因而过度对齐? @Yakk-AdamNevraumont,是的,我很困惑。我想我最初的问题是有效的,但没有用。

以上是关于在 C++11 中具有对齐元素的 std::array 类型的主要内容,如果未能解决你的问题,请参考以下文章

(Bootstrap 4+) - 具有多个元素的列:在同一行上对齐元素

我如何垂直对齐具有不同高度的网格元素? [重复]

确定 C/C++ 结构中元素对齐的算法

在 C 和 C++ 中对齐堆数组以简化编译器 (GCC) 向量化

将任意数量的具有不同宽度的元素对齐到带有环绕的网格

Flutter : 使具有不同图标大小的 IconButtons 和 Row 中的 Text 元素对齐到中心