存储一个 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
循环。
在 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
循环。