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

How to create aligned array of array c++?

本文关键字:数组 c++ 对齐 何创建 创建      更新时间:2023-10-16

我想创建一个由其他数组组成的对齐数组。我知道如何使用std::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;
}

它基本上使用在一大块纯一维数组中分配/访问数组的逻辑

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

#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.