我想使用memalign
和16B分配2D数组(方阵),而不是仅使用malloc
。
我有
A =(float **) malloc( (*dim) * sizeof(float*)); for ( i = 0 ; i < (*dim) ; i++) { A[i] = (float*) malloc(sizeof(float)*(*dim)); }
如何用memalign
更改上面的代码。
使用malloc()
您需要请求15个额外字节,然后将返回的指针向上舍入到最接近的16的倍数,例如:
void* p = malloc(size + 15); void* paligned; if (!p) { /* handle errors */ } paligned = (void*)(((size_t)p + 15) / 16 * 16); /* use paligned */ free(p);
你在这里所拥有的并不是一个2D矩阵,只是一个指向更多1Darrays的1Darrays。
你想要这样的东西吗?
A = (float*) memalign(16, (*dim) * (*dim) * sizeof(float));
这将生成一个1D数组,其长度为dim ^ 2个元素。 这就是2D数组通常在C / C ++中使用的方式(除非您有特定的理由使用指向其他数组的指针数组)。
我假设您希望将此数组提供给某些DSP函数 – 如果不知道您尝试使用的函数,很难知道更多。
如果您必须以A [x] [y]访问数组,则可以执行以下操作:
float *aMemory = (float*) memalign(16, (*dim) * (*dim)); float **A = (float**) malloc(*dim * sizeof(float)); for (i = 0; i < *dim; i++) { A[i] = &aMemory[*dim * i]; }
现在,您可以通过指针数组A访问数组aMemory
// A[row][column] A[0][0] = 0.0f; A[1][1] = 1.0f;
等等
以上就是c/c++开发分享如何动态分配16B对齐的2d数组相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/549657.html