存储std::假定对齐指针C++;20 在C++ 20中,我们假设对齐,这对于音频代码非常有用,其中指向浮动块的指针一直都在传递。假设我们有以下跨度类型: template<typename T> struct Signal { const T* data size_t size; }; 模板 结构信号 { 常数T*数据 大小; };
如何指示此结构中的数据指针由某个constexpr整数对齐?在C++ 20中有可能已经有这种情况了吗?存储std::假定对齐指针C++;20 在C++ 20中,我们假设对齐,这对于音频代码非常有用,其中指向浮动块的指针一直都在传递。假设我们有以下跨度类型: template<typename T> struct Signal { const T* data size_t size; }; 模板 结构信号 { 常数T*数据 大小; };,c++,traits,simd,c++20,memory-alignment,C++,Traits,Simd,C++20,Memory Alignment,如何指示此结构中的数据指针由某个constexpr整数对齐?在C++ 20中有可能已经有这种情况了吗? constexpr int SIMDAlignment = 16; template<typename T> struct Signal { aligned<SIMDAlignment> const T* data size_t size; }; constexpr int SIMDAlignment=16; 模板 结构信号 { 对齐常量T*数据 大
constexpr int SIMDAlignment = 16;
template<typename T>
struct Signal
{
aligned<SIMDAlignment> const T* data
size_t size;
};
constexpr int SIMDAlignment=16;
模板
结构信号
{
对齐常量T*数据
大小;
};
似乎“假定对齐”提示是特定指针对象的属性,不能使其成为指针类型的属性。但是,您可以尝试用一个(内联)getter函数包装该指针,并使用std::aspect\u aligned
作为其返回值。例如,在我的实验中,当我使用这样一个函数返回的指针时,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;
}
致:
生成的程序集包含处理未对齐数据的vmovupd
现场演示:-在这两种情况下都检查
.L19
循环。这是有道理的,从名称来看,它只是GNU C的std
版本void*\u内置\u假定对齐(void*,size\u t)
。(在C语言中使用类似于foo=\uu内置\u假定\u对齐(foo,64);
,其中允许向void*隐式转换/从void*隐式转换。)@PeterCordes Yes;甚至相应的建议也提到了一个可能的实现,即对GCC和Clang使用\u内置的
。在GNU C中,有时可以执行typedef int aligned\u int\u attribute((aligned(16)))
之类的操作,并具有指向该类型的指针,但这是分开的。(这并不容易,因为sizeof(aligned_int)也是16,带有填充)。typedef技巧在声明类型的未对齐和may\u alias
版本时效果更好。
return std::assume_aligned<64>(data);
return data;