Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
存储std::假定对齐指针C++;20 在C++ 20中,我们假设对齐,这对于音频代码非常有用,其中指向浮动块的指针一直都在传递。假设我们有以下跨度类型: template<typename T> struct Signal { const T* data size_t size; }; 模板 结构信号 { 常数T*数据 大小; };_C++_Traits_Simd_C++20_Memory Alignment - Fatal编程技术网

存储std::假定对齐指针C++;20 在C++ 20中,我们假设对齐,这对于音频代码非常有用,其中指向浮动块的指针一直都在传递。假设我们有以下跨度类型: template<typename T> struct Signal { const T* data size_t size; }; 模板 结构信号 { 常数T*数据 大小; };

存储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整数对齐?在C++ 20中有可能已经有这种情况了吗?
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;