Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.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
如何创建数组C++的对齐数组?_C++_Arrays - Fatal编程技术网

如何创建数组C++的对齐数组?

如何创建数组C++的对齐数组?,c++,arrays,C++,Arrays,我想创建一个由其他数组组成的对齐数组。我知道如何使用std::vector实现,但是使用vector的方法不适合我 非常感谢那些能够帮助我的人 下面是我想做的一个例子: for (int i = 0; i < 16; ++i) std::cout << arr[i] << " "; // Prints 0 1 2 3 4 5 6 7 8 9 10...15 int m = 5; for (int i = 0; i < m ; ++i) {

我想创建一个由其他数组组成的对齐数组。我知道如何使用std::vector实现,但是使用vector的方法不适合我

非常感谢那些能够帮助我的人

下面是我想做的一个例子:

for (int i = 0; i < 16; ++i)
    std::cout << arr[i] << " ";
// Prints 0 1 2 3 4 5 6 7 8 9 10...15   

int m = 5;

for (int i = 0; i < m ; ++i) {
    float* varr[i] = (float*) aligned_alloc(32, sizeof(float)*8); 

    int k = i*8;

    varr[i] = {arr[k+0], arr[k+1], arr[k+2], arr[k+3], arr[k+4], arr[k+5], arr[k+6], arr[k+7]};
}

    varr[0] = {arr[0], arr[1], arr[2], arr[3], arr[4], arr[5], arr[6], arr[7]};   
    // Prints: 0 1 2 3 4 5 6 7

    varr[1] = {arr[8], arr[9], arr[10], arr[11], arr[13], arr[14], arr[15], arr[16]}; 
    // Prints: 8 9 10 11 12 13 14 15

    varr[2] = .....;
    varr[3] = .....;
    varr[4] = .....;

我不确定avx指令,但我修改的方法如下:

int main (){

    int dim1{5}, dim2{8};

    float* varr = static_cast<float*> (aligned_alloc(sizeof(float)*dim1*dim2, sizeof(float)*dim1*dim2));

     for (int i = 0; i < dim1 ; ++i) {

         for (int j = 0; j < dim2; ++j) {
             varr[i*dim2+j] =i*dim2 + j;
         }
     }

     for (int i = 0; i < dim1 ; ++i) {
         for (int j = 0; j < dim2; ++j) {
             std::cout << &varr[i*dim2+j] << ",";
         }
         std :: cout << "\n";
     }
return 0;
}
它基本上使用在纯1D数组的一大块中分配/访问数组的逻辑

另一种方法是使用指向如下指针的指针:

#include <iostream>

int main (){

    int dim1{5}, dim2{8};

    float** varr = static_cast<float**> (aligned_alloc(sizeof(float*)*dim1, sizeof(float*)*dim1));
    for(int i=0; i<dim1; ++i){
        varr[i] = static_cast<float*> (aligned_alloc(sizeof(float)*dim2, sizeof(float)*dim2));
    }

     for (int i = 0; i < dim1 ; ++i) {

         for (int j = 0; j < dim2; ++j) {
             varr[i][j] = 0.1 + static_cast<float>(i*dim2 + j);
         }
     }

     for (int i = 0; i < dim1 ; ++i) {
         for (int j = 0; j < dim2; ++j) {
             std::cout << &varr[i][j] << ",";
         }
         std :: cout << "\n";
     }
return 0;
}

但问题是内存没有在第一维度dim1上对齐

std::vector变量有什么问题?最初我有一个数组,它必须拆分成包含8个成员的数组才能加载到avx寄存器\u mm256\u load\u psvarr中。所有阵列数据必须对齐。当我使用vector时,我丢失了一个对齐,并将数据存储回了\u mm256\u store\u psarr,varr[I]。向量编译给了我一个错误。甚至当我使用对齐的分配器来对齐向量时。你们不能使用向量吗?你们的解决方案不起作用吗?到底是什么问题?显示向量的代码工作。也许我们可以帮你解决这个问题。问题是关于对齐阵列的,所以这不能回答它。你为什么这么说?内存在1D阵列中完全对齐。就我从问题中了解到的情况而言,作者希望所有数据都在一维数组中,但使用二维模式访问它们。问题的摘要指定了对齐的数据,代码使用对齐的alloc清楚地表明,它指的是非标准对齐。评论进一步明确了OP需要在数组内容上使用SIMD AVX指令。我已经解决了这个问题。我在使用向量实现时犯了一些愚蠢的错误。现在它工作了。加延德拉解决方案的建议非常有趣。我想我会尽量采纳你的建议。谢谢大家。如果你认为我的解决方案很有用,那么你能接受我的答案并/或投票表决吗?也许可以发布对你有用的内容,以便社区中的其他人也能受益