存储一个 std::assume_aligned 指针 C++ 20

Storing an std::assume_aligned pointer C++ 20

在 C++ 20 中,我们假设对齐,这对于始终传递指向对齐的浮点块的指针的音频代码非常有用。假设我们有以下跨度类型:

template<typename T>
struct Signal
{
    const T* data
    size_t size;
};

如何指示此结构中的数据指针由某个 constexpr 整数对齐?在 C++ 20 中是否已经可以实现类似的功能?

constexpr int SIMDAlignment = 16;

template<typename T>
struct Signal
{
    aligned<SIMDAlignment> const T* data
    size_t size;
};

assume-aligned提示似乎是一个特定指针对象的属性,它不能成为一个指针的属性类型。但是,您可能会尝试通过(内联)getter 函数包装该指针,并使用 std::assume_aligned 作为其 return 值。例如,在我的实验中,当我使用由这样一个函数编辑的指针 return 时,它被 GCC 正确地视为“对齐”(指向对齐的数据):

double* f()
{
  static double* data =
    (double*)std::aligned_alloc(64, 1024 * sizeof(double));
  return std::assume_aligned<64>(data);
}

void g()
{
  double* a = f();
  for (int i = 0; i < 1024; i++)
    a[i] = 123.45;
}

在这种情况下,数组由 vmovapd 填充,这需要对齐内存访问。

相反,当我改成:

return std::assume_aligned<64>(data);

至:

return data;

生成的程序集包含 vmovupd,可处理未对齐的数据。

现场演示:https://godbolt.org/z/d5aPPj — 检查两种情况下的 .L19 循环。